Tout d'abord, notez que les extraits de code suivants sont identiques.
public void foo() {
synchronized (this) {
// do something thread-safe
}
}
et:
public synchronized void foo() {
// do something thread-safe
}
faire exactement la même chose. Pas de préférence pour l'un d'eux, sauf pour la lisibilité du code et de style.
Lorsque vous ne synchroniser des méthodes ou des blocs de code, il est important de savoir pourquoi vous faites telle chose, et ce que l'objet est exactement le verrouillage, et pour quel but.
Notez également qu'il existe des situations dans lesquelles vous souhaitez côté client synchroniser des blocs de code dans lequel le moniteur que vous demandez (c'est à dire l'objet synchronisé) n'est pas nécessairement this
, comme dans cet exemple :
Vector v = getSomeGlobalVector();
synchronized (v) {
// some thread-safe operation on the vector
}
Je vous suggère d'obtenir plus de connaissances sur la programmation simultanée, il vous servira beaucoup une fois que vous savez exactement ce qui se passe derrière les coulisses. Vous devriez vérifier la Programmation Simultanée en Java, un grand livre sur le sujet. Si vous voulez une petite plongée dans le sujet, découvrez Java Simultanéité @ Soleil