Statiques et non statiques de verrouillage de l'objet dans le bloc synchronisé

Essayer de visualiser et de comprendre synchronisation.

  1. Quelles sont les différences entre l'utilisation d'un statique de verrouillage objet (code) et un non statique de verrouillage objet (code B) pour un synchronisé bloc?
  2. Comment est-il différent dans les applications pratiques?
  3. Quels sont les obstacles qu'on aurait que l'autre ne le serait pas?
  4. Quels sont les critères pour déterminer lequel utiliser?

Code Un

public class MyClass1 {
  private static final Object lock = new Object();
  public MyClass1() {
    //unsync
    synchronized(lock) {
      //sync
    }
    //unsync
  }
}

Code B

public class MyClass2 {
  private final Object lock = new Object();
  public MyClass2() {
    //unsync
    synchronized(lock) {
      //sync
    }
    //unsync
  }
}

Note

Le code ci-dessus montre les constructeurs, mais vous pourriez parler de la façon dont le comportement est différent dans une méthode statique et non méthode statique trop. Aussi, serait-il avantageux d'utiliser un statique de verrouillage lors de la synchronisation de bloc est de la modification d'une variable membre statique?

Je l'ai déjà regardé les réponses dans cette question, mais c'est pas assez clair sur ce que les différents scénarios d'utilisation sont.

  • "Notez que le code ci-dessus montre les constructeurs," C'est une distinction importante. Un bloc synchronisé avec un champ d'instance sur un constructeur est absolument inutile, car aucun les deux fils ne sera jamais exécuter un constructeur sur la même instance.
  • En fait, à bien y penser, cette instance pourrait contient un objet qui est partagé entre les threads. Par exemple private final Object lock = "niceLiteralString";.
  • Je comprends l'aide de constructeurs de montrer l'exemple était une mauvaise idée. Ma question s'étend à statiques et non statiques et méthodes. Aussi, comment ne partage de la statique/champ d'instance affecter le verrouillage?
  • "comment fonctionne le partage de la statique/champ d'instance affecter le verrouillage?" La serrure n'est pas sur le terrain, mais sur l'instance de l'objet que le champ contient. Donc synchronized (a){}; synchronized(b){}; synchronized(c){} pourrait tous se retrouver à l'aide de la même serrure. Ils peuvent également lancer des NullPointerExceptions, si le champ est null.
  • cet article en fait l'argument que les littéraux de Chaîne doit être évitée pour une bonne raison - la réutilisation des références par la JVM.
  • C'était juste un exemple pour illustrer le fait que même si votre domaine est privé, l'objet qu'il contient peut-être pas.

InformationsquelleAutor ADTC | 2013-08-21