JavaRush /Blogue Java /Random-PT /Sincronização de threads, bloqueio de objetos e bloqueio ...
CynepHy6
Nível 34
Великий Новгород

Sincronização de threads, bloqueio de objetos e bloqueio de classe

Publicado no grupo Random-PT
Sincronização de threads, bloqueio de objetos e bloqueio de classe - 1A sincronização refere-se ao multithreading. Um bloco de código sincronizado só pode ser executado por um thread por vez. Java oferece suporte a vários threads para execução. Isso pode resultar em dois ou mais threads acessando o mesmo campo ou objeto. A sincronização é um processo que permite que todos os threads paralelos de um programa sejam executados de forma síncrona. A sincronização evita erros de consistência de memória causados ​​por acesso inconsistente à memória compartilhada. Quando um método é declarado como sincronizado, o thread mantém um monitor para o objeto cujo método está sendo executado. Se outro thread estiver executando um método sincronizado, seu thread será bloqueado até que o outro thread libere o monitor. A sincronização é obtida em Java usando uma palavra reservada synchronized. Você pode usá-lo em suas aulas definindo métodos ou blocos sincronizados. Você não poderá usar synchronizedvariáveis ​​ou atributos em uma definição de classe.

Bloqueio em nível de objeto

Este é um mecanismo para sincronizar um método não estático ou bloco de código não estático, de modo que apenas um thread possa executar um determinado bloco ou método em uma determinada instância de uma classe. Isso deve ser feito sempre que você precisar tornar o thread de dados em nível de instância seguro. Exemplo:
public class DemoClass{
    public synchronized void demoMethod(){}
}
ou
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
ou
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Bloqueio em nível de classe

Impede que vários threads entrem em um bloco sincronizado durante a execução em qualquer uma das instâncias disponíveis da classe. Isso significa que se houver 100 instâncias da classe durante a execução de um programa DemoClass, então apenas um thread naquele momento poderá ser executado demoMethod()em qualquer um dos casos, e todos os outros casos serão bloqueados para outros threads. Isso é necessário quando você precisa tornar o thread de dados estáticos seguro.
public class DemoClass{
    public synchronized static void demoMethod(){}
}
ou
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
ou
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Algumas notas importantes

  1. A sincronização em Java garante que dois threads não possam executar um método sincronizado ao mesmo tempo ou em paralelo.

  2. synchronizedsó pode ser usado com métodos e blocos de código. Esses métodos ou blocos podem ser estáticos ou não estáticos.

  3. Sempre que qualquer thread entra em um método ou bloco sincronizado, ele adquire um bloqueio e sempre que um thread sai de um método ou bloco sincronizado, a JVM libera o bloqueio. O bloqueio é liberado mesmo se o thread sair do método sincronizado após a conclusão devido a erros ou exceções.

  4. synchronizedem Java , isso significa que se um método sincronizado chamar outro método sincronizado que requer o mesmo bloqueio, o thread atual que contém o bloqueio poderá entrar nesse método sem adquirir o bloqueio.

  5. Синхронизация в Java будет бросать NullPointerException если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется How null, синхронизированный (lock) бросит NullPointerException.

  6. Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.

  7. Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.

  8. В соответствии со спецификацией языка вы не можете использовать synchronized в конструкторе это приведет к ошибке компиляции.

  9. Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс String, который уже неизменяемый и финальный.

Удачи в обучении!! Оригинал: Object level lock vs Class level lock in Java
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION