Bloco synchronized

3 respostas
G

Tenho dúvidas com relação a blocos synchronized quando usam um objeto que é um atributo, algo assim:

public Class {
	private Pessoa pessoa;

	synchronized (pessoa) {
        	
	}
}

O que isto quer dizer exatamente? Qual a diferença de eu fazer desta forma e usar um this no lugar do pessoa no bloco?

3 Respostas

V

Significa que o monitor vai ser o objeto pessoa, e não this.
Ou seja, você terá que chamar notify() e wait() sobre pessoa.

Não é uma boa idéia definir como monitor um objeto complexo, como uma classe Pessoa.
Se essa classe tiver algum de seus métodos sincronizados, vai dar bagunça.

Idealmente, use um objeto simples, como um int[0].

Nada impede você ter uma classe com dois objetos de sincronização. Threads que forem pegas no wait() do objeto A, só serão acordadas pelo notify do objeto A, e o mesmo vale para o objeto B.

Outra coisa, Threads é um assunto de Java Avançado. Estou movendo o tópico.

G

Estou entendendo…e no caso de um método sincronizado:

public Class {  
        void synchronized () {  
                  
        }  
    }

Quem é o monitor? O objeto ou cada método/bloco possui seu próprio monitor?

V

Se o método não for estático, o monitor será this.
Se for estático, será SuaClasse.class

Aliás, o fato do padrão do java ser this, reforça o argumento de que um objeto complexo não deva ser usado de monitor.

Se vc faz:

synchronized (pessoa) { //faz qualquer coisa }

E pessoa tiver métodos sincronizados, poderá ocorrer um comportamento indesejado, já que provavelmente quem sincronizou o método da classe pessoa não estava esperando que esse monitor estivesse sendo usado fora da classe.

Criado 20 de julho de 2011
Ultima resposta 22 de jul. de 2011
Respostas 3
Participantes 2