Senkronize(bu) Java önlemek?
Bu YÜZDEN bir soru hakkında Java senkronize açılır zaman, bazı insanlar synchronized(this)
Kaçınılması gerektiğine işaret etmeye istekli çok. Bunun yerine, iddia, özel bir başvuru üzerinde bir kilit tercih edilmelidir.
Belirli bazı nedenleri vardır:
- some evil code may steal your lock (Bu çok popüler bir de "yanlışlıkla" türevi) . bir vardır
- all synchronized methods within the same class use the exact same lock, which reduces throughput
- you are (unnecessarily) exposing too much information
Diğer insanlar, ben dahil, synchronized(this)
Bir sürü (aynı zamanda Java kitaplıkları) kullanılır, güvenli ve iyi anlaşılan bir deyim olduğunu savunuyorlar. Bir hata var, çünkü kaçınılmalıdır değil ve çok parçalı programda ne olup bittiğini en ufak bir fikrin bile yok. Diğer bir deyişle: Eğer Uygulanabilir ise, o zaman kullanın.
this
kilit önleme synchronized(this)
da iş yapacağı zaman tercih edilir gerçek dünyadaki bazı örnekler (falanca şeyler görmek ilgileniyorum.
Bu nedenle:her zaman synchronized(this)
önlemek ve özel bir başvuru üzerinde bir kilit ile değiştirmek gerekir?
< / ^ hr .
Biraz daha fazla bilgi (cevap verilmiştir güncellenir)
- örnek eşitleme bahsediyoruz
synchronized(this)
örtülü (yöntemler senkronize) ve açık hem de form olarak kabul edilir- eğer alıntı Bloch veya diğer yetkililer konu, bırakmayın parçaları yok gibi (örneğin; Etkin Java, madde Parçacığı Güvenliği: "Genellikle bu kilidi örneği kendisi, ama istisnalar vardır.")
- eğer
synchronized(this)
sağlar daha başka kilitleme parçalı yapı,synchronized(this)
konumuz bu değil bu yüzden geçerli değildir
CEVAP
Her noktası ayrı ayrı ele alacağız.
Bazı kötü kod kilidi (bu çok popüler biri, aynı zamanda bir var çalmak olabilir "yanlışlıkla" varyant)
Hakkında daha fazla endişeliyimyanlışlıkla. Tutarı ne
2.this
bu sınıf' arayüzü maruz kalan, ve belgelenmiş olmalıdır. bir parçası olmasıdır Bazen kilidini kullanmak için başka bir kod becerisi istenen. BuCollections.synchronizedMap
gibi şeylerin gerçek (javadoc bakın).
Aynı sınıf içindeki tüm senkronize yöntemleri aynı kullanın verimi azaltan kilit
Bu aşırı basit düşünme, sadece synchronized(this)
kurtulmak sorunu çözmez. Performans için uygun eşitleme daha düşünce alır.
- 3=başlangıç
(Gereksiz yere) çok fazla bilgi ifşa ederim
Bu #1 çeşididir.
synchronized(this)
kullanım arayüzü bir parçasıdır. Eğer bu açığa ihtiyacı/istemiyorsan eğer, sakın yapma.
Nasıl JSP dosyaları Java kod önlemek i...
Set kullanımı(önerilen|Maksimum|Minimu...
C# java'senkronize anahtar kelime...
Neden “senkronize” Java 8'de İzin Veri...
Nasıl senkronize statik yöntemler Java...