2015-03-08 6 views
6

Basit soru:Senkronizasyon: Neden sınıfın sınıf nesnesi yerine özel bir son statik nesneyi kilitlemek tercih edilir?

Bu neden tercih edilmesi gerekir:

public class Foo { 

    public static void doSomething() { 
     synchronized(Foo.class) { 
      //code 
     } 
    } 
} 

veya bu:

public class Foo { 

    public synchronized static void doSomething() { 
     //code 
    } 
} 

bu aşkın

public class Foo { 

    final private static Object foo = new Object(); 

    public static void doSomething() { 
     synchronized(Foo.foo) { 
      //code 
     } 
    } 
} 

? Bana bunların hepsi için

esasen aynı gibi görünür, bu yüzden bir diğerinden daha iyi olacağını neden statik alanlara erişimi eşitlemek için en iyi yol, ya da ne emin değilim, ama sık sık tercih edilmektedir birinci duydum .

cevap

6

Bu, enkapsülasyon ile ilgilidir. Özel bir alanda kilitleniyorsanız, aynı nesne üzerinde başka hiçbir kod kilitlenemez. Sınıf nesnesini veya bir örneği kilitliyorsanız, sınıfınızdaki örneklere erişimi olan başka herhangi bir kod da, aynı siparişi kilitleyebilir ve kilitleme sıralaması ihlallerinin neden olduğu kilitlenme gibi beklenmedik senkronizasyon sorunlarını tanıtabilir.

İlgili konular