Synchronized?

7 respostas
V

O que é e para que serve Synchronized?





Obrigado

Volnei Granado Munhoz :wink:

7 Respostas

R

Ola Volnei,



O synchronized serve para que esse bloco de código seja executado apenas por 1 thread por vez.



[]´s,

Raphael

V

Aonde encontro mais detalhes?





Volnei Granado Munhoz :wink:

B

É importante resssaltar que o synchronized atua sobre o objeto em questão.

Portanto, havendo dois objetos distintos, o mesmo método poderia estar sendo executado por threads diferentes.



Você pode ler a respeito no Language Specification:

Blocos de código: http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#255769

Métodos: http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#260369

G
Na prática synchronized é utilizado principalmente em métodos estáticos e objetos singleton (pelo menos é meu ponto de vista).


Por exemplo, um gerador de IDs únicos chamado por diversas threads ao mesmo tempo, ou uma classe de log…

C

Na verdade, devemos também usar métodos (ou blocos) synchronized toda vez que o acesso de mais de uma linha de execução (thread) a um determinado atributo (modificado por este método ou bloco de código) de um objeto puder causar inconsistências nos dados ou condições de corrida :slight_smile:

[ Esta mensagem foi editada por: Copernico em 07-03-2003 11:46 ]

H
A chave para entender sincronização é a noção de ´lock´ ou ´monitor´, cuja metáfora é aquele bastão que os corredores passam um para o outro nas corridas.





Cada objeto possui um lock que pode ser disputado por qualquer thread.





Cada classe possui também um lock associado que corresponde ao seu objeto Class.





A palavra-chave synchronized quando aplicada a um método dinâmico deixa implícito que o lock utilizado é o do objeto ´this´, ou seja seu auto-ponteiro.





A palavra-chave synchronized quando aplicada a um método estático deixa implícito que o lock utilizado é o do objeto Class da sua classe.





Para explicitar um lock, tem que ser utilizado blocos syncronizados.





Exemplos:





class X


{


   void y()


   {


      ; // código não sincronizado


      synchronized (referencia_ao_objeto_cujo_lock_estah_sendo_disputado)


      {


        ; // código sincronizado


      }


      ; // código não sincronizado


  }


}





Obs.:





referencia_ao_objeto_cujo_lock_estah_sendo_disputado pode ser um dos seguintes:





- referência qualquer obtida com o operador new


- this, o autoponteiro de um objeto


- getClass(), para pegar o objeto Class de uma classe


- Class.forName("umaClasseQualquer"), para pegar um lock qualquer





Em consequência, são equivalentes os seguintes pares de fragmentos:





void m()


{


   synchronized (this)


  {


      ; // código sincronizado


  }


}





equivale a





synchronized void m()


{


    ; // código sincronizado


}





e





static void m()


{


   synchronized (getClass())


  {


      ; // código sincronizado


  }


}





equivale a


synchronized static void m()


{


    ; // código sincronizado


}














}
H
Duas correções no exemplo anterior:





1. getClass() retorna o objeto Class de um objeto e não de uma classe.





2. A segunda equivalência correta é:





static void m()


{


synchronized (Class.forName("NomeDaClasse"))


{


; // código sincronizado


}


}





equivale a





synchronized static void m()


{


; // código sincronizado


}
Criado 5 de março de 2003
Ultima resposta 12 de mar. de 2003
Respostas 7
Participantes 6