2009-09-11 7 views

Répondre

14

Oui. Il obtient le verrou sur l'objet représentant la classe la méthode est définie dans (par exemple MyClass.class)

0

Oui, et il simplifie les méthodes d'usine statiques comme celle-ci:

class Foo { 
    private Foo() {} 

    public static synchronized Foo getInstance() { 
     if (instance == null) { 
      instance = new Foo(); 
     } 
     return instance; 
    } 

    private static Foo instance = null; 
} 

Voici ce qu'il pourrait ressembler si méthodes static ne pouvaient pas être synchronized:

class Foo { 
    private Foo() {} 

    public static Foo getInstance() { 
     synchronized (LOCK) { 
      if (instance == null) { 
       instance = new Foo(); 
      } 
     } 
     return instance; 
    } 

    private static Foo instance = null; 

    private static final Object LOCK = Foo.class; 
    // alternative: private static final Object LOCK = new Object(); 
} 

pas un gros problème, il enregistre seulement 2 lignes de code.

+0

En fait, ces deux versions sont horribles. il suffit d'initialiser le champ d'instance directement dans sa déclaration. Il sera ensuite initialisé lorsque la classe est accédée pour la première fois et synchronisé implicitement une fois, permettant aux appels de sous-séquence de getInstance() d'être désynchronisés. –

+0

et nous savons tous que les usines statiques comme celle-ci sont mauvaises. Parfois, il faut faire le mal pour faire le travail, mais ça ne va pas. Mieux vaut injecter des ressources. –

Questions connexes