O que é e para que serve Synchronized?
Obrigado
Volnei Granado Munhoz 
Synchronized?
7 Respostas
Ola Volnei,
O synchronized serve para que esse bloco de código seja executado apenas por 1 thread por vez.
[]´s,
Raphael
Aonde encontro mais detalhes?
Volnei Granado Munhoz 
É 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
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…
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 
[ Esta mensagem foi editada por: Copernico em 07-03-2003 11:46 ]
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
}
}
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
}