1
resposta

[Dúvida] syncronyzed this e atributo da classe

Olá, bom dia!!

Estou com uma dúvida sobre o uso do syncronyzed. Entendi que deveria ser utilizado quando deseja que apenas uma thread acesse o recurso e que ele vai ser executado até que finalize, ou seja, de forma atômica.

Sobre os formatos, poderia usar synchronized (this), sincronizando o objeto, e public synchronized ... , sincronizando acesso ao método, e aí foi quando as dúvidas surgiram. Então considerando,

Dois metódos com bloco de código usando synchronized (this):

  1. Se temos uma classe Banheiro com duas instâncias. Se cada uma tiver uma thread, elas podem executar de forma corrente porque não teria bloqueio. Entendo que seria como tivesse dois banheiros disponíves, então duas pessoas podem acessar ao mesmo tempo.

Dois metódos usando synchronized (this):

  1. Considerando duas instâncias de Banheiro, como o acesso ao método que é sincronizado, apenas uma instância acessa o metódo por vez, certo? Logo, mesmo que dois banheiros esteja disponível, apenas um pode ser usado por vez.

Seria essa a diferença? Caso não, poderia me explicar e apresentar exemplos? Mencionei o uso de Banheiro por ser o mesmo que o professor Nico utilizou nas aulas.

1 resposta

Diferenças entre synchronized (this) e synchronized em métodos Sua compreensão sobre o uso do synchronized está correta. Ele garante que apenas uma thread acesse um recurso de cada vez, permitindo a execução atômica de operações. As duas formas que você mencionou, synchronized (this) e public synchronized ..., sincronizam o acesso a recursos de maneiras diferentes:

  1. synchronized (this):

Sincroniza o objeto em que o bloco de código está contido. Permite que apenas uma thread execute o bloco de código por vez no mesmo objeto. Exemplo:

class Banheiro {
    public synchronized void usarBanheiro() {
        // Código para usar o banheiro
    }
}

Banheiro banheiro1 = new Banheiro();
Banheiro banheiro2 = new Banheiro();

Thread thread1 = new Thread(() -> banheiro1.usarBanheiro());
Thread thread2 = new Thread(() -> banheiro2.usarBanheiro());

thread1.start();
thread2.start();

Neste exemplo, as threads podem executar usarBanheiro() concorrentemente porque cada thread usa um objeto Banheiro diferente. O synchronized garante que apenas uma thread use cada instância de Banheiro por vez.

Neste exemplo, as threads podem executar usarBanheiro() concorrentemente porque cada thread usa um objeto Banheiro diferente. O synchronized garante que apenas uma thread use cada instância de Banheiro por vez.

class Banheiro {
    public synchronized void usarBanheiro() {
        // Código para usar o banheiro
    }
}

Banheiro banheiro1 = new Banheiro();
Banheiro banheiro2 = new Banheiro();

Thread thread1 = new Thread(() -> banheiro1.usarBanheiro());
Thread thread2 = new Thread(() -> banheiro2.usarBanheiro());

thread1.start();
thread2.start();

Neste exemplo, as threads não podem executar usarBanheiro() concorrentemente, mesmo que usem objetos Banheiro diferentes. O synchronized no método garante que apenas uma thread execute o método em qualquer momento, bloqueando o acesso em todas as instâncias.

Observações:

O uso excessivo de synchronized pode afetar o desempenho da aplicação. É importante escolher o método de sincronização mais adequado para cada caso.