GARANTIR DESCONTO

Fórum Como usar synchronized? #565479

09/04/2009

0

Olá! Eu já entendi que se eu fizer
public synchronized void meuMetodo() {
}
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.
try {
  synchronized(getTreeLock()) {
    // ... 
  }
  // ...
}
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!
Carlos Coral

Carlos Coral

Responder

Posts

09/04/2009

Marcos Pereira

[quote="duCoral"]
try {
  synchronized(sincronizeEsseCara) {
    // ... 
  }
  // ...
}
Quer dizer que vc vai sincronizar o acesso/uso a um objeto ou classe. Se vc fizer algo como:
try {
  synchronized(this) {
    // ... 
  }
  // ...
}
Vai sincronizar o acesso ao objeto this, o qual chamou o metodo. O getTreeLock() (não fui ver o que o metodo retornar) sincroniza o acesso de multiplas threads ao objeto retornado por tal metodo. Vale uma olhada na Java Language Specification para saber melhor. Dá um procurada no forum que vc acha o link... valeuz...
Responder

Gostei + 0

09/04/2009

Marcos Pereira

O use de synchronized na frente de um método é uma notação compacta para o caso trivial de um bloco sincronizado:
synchronized void xxx()
{
  ...  // código sincronizado
}
é equivalente a
void xxx()
{
  synchronized(this)
  {
     ... // código sincronizado
  }
}
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).
Responder

Gostei + 0

09/04/2009

Marcos Pereira

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).
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar