Java kritik bölümlerde, senkronize ne yapmalıyım?
Java, kod, kritik bölümler ilan deyimsel yolu şudur:
private void doSomething() {
// thread-safe code
synchronized(this) {
// thread-unsafe code
}
// thread-safe code
}
Neredeyse tüm blok this
, senkronize ama bunun için özel bir sebep var mı? Başka olasılıklar var mı? Üzerinde eşitlemek için hangi nesne üzerinde herhangi bir iyi yöntemler var mı? (Object
? özel örnekler) gibi
CEVAP
Önceki answerers belirttiği gibi, en dar kapsamlı (başka bir deyişle, bu işten paçayı nasıl sıyıracağını en kısıtlayıcı kapsam seçin ve kullanın.) bir nesne üzerinde eşitlemek için bir uygulamadır Özellikle, this
senkronizasyon sınıf kullanıcılar kilit sağlamasına izin vermek için düşünmüyorsanız iyi bir fikir değil.
Özellikle çirkin bir durum varsa java.lang.String
üzerinde eşitlemek için seçerseniz, yine de ortaya çıkar. Dizeleri (ve pratikte her zaman neredeyse) staj yaptım. Bu eşit her dizesi - içerik anlamına gelirTÜM JVM- perde arkasında aynı dize olduğu ortaya çıkıyor. Eğer herhangi bir Dize üzerinde eşitlemek için, başka bir (tamamen) farklı ayrıca aynı içeriğe sahip bir Dize üzerinde kilitler kod bölümü, aslında kod olarak kilitlenir anlamına gelir.
Ben bir ara bir sorun giderme çıkmaz bir üretim sistemi ve (çok acı) takip kilitlenme için iki tamamen farklı açık kaynak paketleri her senkronize bir örneğinin Dize olan içeriği hem de vardı "LOCK"
.
Senkronize(bu) Java önlemek?...
C# java'senkronize anahtar kelime...
Neden “senkronize” Java 8'de İzin Veri...
java.net.URLEncoder.kodlama(Dizi), ben...
Nasıl senkronize statik yöntemler Java...