Soru .Class için Java Senkronize Blok


Bu java kodu ne anlama geliyor? Bütün nesneler üzerinde kilitlenecek mi MyClass?

synchronized(MyClass.class) {
   //is all objects of MyClass are thread-safe now ??
}

Yukarıdaki kodun bundan farkı nedir?

synchronized(this) {
   //is all objects of MyClass are thread-safe now ??
}

76
2018-01-13 11:33


Menşei


İlgili: stackoverflow.com/questions/437620/... - finnw


Cevaplar:


Snippet synchronized(X.class) sınıf örneğini bir monitör olarak kullanır. Yalnızca bir sınıf örneği (çalışma zamanında sınıf meta verilerini temsil eden nesne) olduğundan, bu satırda bir iş parçacığı olabilir.

İle synchronized(this) blok, örnek tarafından korunur. Her örnek için sadece bir iş parçacığı bloğa girebilir.

synchronized(X.class) blokta tam olarak bir Thread olduğundan emin olmak için kullanılır. synchronized(this) Örnek başına tam olarak bir iş parçacığı olmasını sağlar. Bu, gerçek kodu blok parçacığı güvenli hale getiriyorsa, uygulamaya bağlıdır. Örneğin yalnızca durumunu mutasyona uğratırsanız synchronized(this) yeterlidir.


118
2018-01-13 11:35



"çok sayıda iş parçacığı bloğa örnek olarak girebilir" ifadesi, ikinci formun gerçek olmayan bir semafor gibi davrandığını ima eder. Şöyle bir şey söylemelisiniz: "Senkronize (bu), sınıfın belirli bir örneği için yalnızca bir iş parçacığının bloğa girmesini sağlar". - liwp
Düzeltildi. Bunu söylemek istedim. - Thomas Jung
sınıf örneği vs örneği nedir? - Weishi Zeng


Diğer cevaplara eklemek için:

static void myMethod() {
  synchronized(MyClass.class) {
    //code
  }
}

eşdeğerdir

static synchronized void myMethod() {
  //code
}

ve

void myMethod() {
  synchronized(this) {
    //code
  }
}

eşdeğerdir

synchronized void myMethod() {
  //code
}

69
2018-01-13 12:45



İlk iki örnekte "statik" anahtar kelimesi bulunduğunu anlamak için bana ikinci bir okuma yaptı. Sadece bunu görmüş ve özlemiş olanlara işaret et. Statik anahtar kelime olmadan ilk iki örnek aynı olmazdı. - kurtzbot
Bu örnekler eşdeğer DEĞİLDİR! Senkronize yöntemler, bir iş parçacığı yöntemleri çağırmaya çalıştığında bir delik olarak "senkronize" edilir. Diğer taraftan bloklar, bunların üzerinde ve altında birden fazla iş parçacığı tarafından yürütülebilen kodlara sahip olabilir. Sadece blok içinde senkronize olurlar! Bu aynı değil! - JacksOnF1re
Genel Statik Singleton getInstance () {if (örnek == null) {Senkronize (Singleton.class) {instance = new Singleton (); }} örnek döndürmek; } - JacksOnF1re
Bütün nokta oradaki olduğu dışında kod yok synchronized blokları. Bu onları eşdeğer hale getirir. Bir örneği değiştirirseniz, aslında onlar artık aynı değildir. - Jorn


Hayır, ilk sınıf tanımının bir kilidi olacak MyClasstüm örnekleri değil. Ancak, bir örnekte kullanılırsa, bu, tüm diğer örnekleri etkili bir şekilde engelleyecektir, çünkü bunlar tek bir sınıf tanımını paylaşırlar.

İkincisi sadece geçerli örnek üzerinde bir kilit alır.

Bu, nesnelerinizin iş parçacığını güvenli hale getirip getirmediğiyle ilgili olarak, bu çok daha karmaşık bir soru - kodunuzu görmemiz gerekecek!


21
2018-01-13 11:35



evet, MyClass.class herhangi bir statik değişken olabilir ve aynı etkiye sahip olabilir. - pstanton