Como usar synchronized?
Olá!
Eu já entendi que se eu fizer
vou garantir o sincronismo de [b]meuMetodo[/b] quando ele for executado por [i]threads[/i].
Abaixo, tem um exemplo de código que peguei do fonte de JComponent.
O que eu não entendi ainda é o que acontece com [b]getTreeLock()[/b], neste caso.
Para que servem os [b]parênteses[/b] na [b]sintaxe[/b] de [b]synchronized[/b]?
Valeu!
public synchronized void meuMetodo() {
}try {
synchronized(getTreeLock()) {
// ...
}
// ...
}Carlos Coral
Curtidas 0
Respostas
Marcos Pereira
09/04/2009
[quote="duCoral"]
Quer dizer que vc vai sincronizar o acesso/uso a um objeto ou classe. Se vc fizer algo como:
try {
synchronized(sincronizeEsseCara) {
// ...
}
// ...
}try {
synchronized(this) {
// ...
}
// ...
}GOSTEI 0
Marcos Pereira
09/04/2009
O use de synchronized na frente de um método é uma notação compacta para o caso trivial de um bloco sincronizado:
é equivalente a
O segredo para dominar sincronização é entender que o código dentro de um bloco sincronizado só será executado se a thread que está tentando executá-lo tiver posse do lock especificado nos parênteses.
Todo objeto Java, veja bem, objeto e não classe, possui um lock associado. Esse lock pode ser disputado por qualquer trecho de código sincronizado, e em qualquer thread.
Como posso obter um lock:
1 - uma referência a um objeto criado com o operador new;
2 - uma referência a um objeto criado com newInstance();
3 - a construção XXX.class de uma classe XXX;
4 - O objeto class obtido com Class.forName("XXX") de uma classe XXX;
5 - o autoponteiro [i]this[/i].
Repare que eu posso sincronizar em relação a um objeto específico da classe (1, 2, 5) ou a todos os objetos de uma classe (3, 4).
synchronized void xxx()
{
... // código sincronizado
}
void xxx()
{
synchronized(this)
{
... // código sincronizado
}
}
GOSTEI 0
Marcos Pereira
09/04/2009
Ooops,
Não é:
Repare que eu posso sincronizar em relação a um objeto específico da classe (1, 2, 5) ou a todos os objetos de uma classe (3, 4).
Mas sim:
Repare que eu posso sincronizar em relação a um objeto específico da classe (1, 2, 5) ou à estrutura estática da classe (que é em si também um objeto) (3, 4).
GOSTEI 0