Senkronize edilmekten vazgeçmenin, beklemenin ve bildirim yapmanın zamanı geldi mi?


13

A'nın kullanılmasının synchronizedtercih edildiği tek bir senaryo var mı (eski JVM'lerle uyumluluk dışında) Lock? Herkes yeni sistemleri kullanarak waitveya notifyüzerinde haklı çıkarabilir mi?

Uygulamasında bunlardan birini kullanması gereken herhangi bir algoritma var mı ?

Bu konuya değinen önceki soruları görüyorum, ancak bunu biraz daha ileriye götürmek istiyorum ve aslında deprecateonları. Onlarla birlikte yeni tesislerle ütülenen çok fazla tuzak, tuzak ve uyarı var. Yakında onları eskimiş olarak işaretlemenin zamanı geldiğini hissediyorum.


4
Uygulamada Brian Goetz'in Java Concurrency bölümünü okudunuz mu? Orada örtük vs açık kilit tartışmasını güzel bir şekilde ele alıyor.
Martijn Verburg

@MartijnVerburg - Ne yazık ki hayır ama işine büyük saygı duyuyorum.
OldCurmudgeon

1
senkronize anahtar kelime iş parçacığı güvenli olması gereken basit statik yöntemleri ile yararlı olabilir, başka bir şey için ben eşzamanlı kullanırsınız. Ama bu benim görüşüm
Kemoda

Yanıtlar:


12

Uygulamasında bunlardan birini kullanması gereken herhangi bir algoritma var mı?

Neredeyse kesinlikle değil. (Gerçekten de, teorik açıdan, diğer java.util.concurrent . Sınıflarını kullanarak bekleme / bildirim simüle edebilmelisiniz . Senkronize edilmiş açık Kilit işlemleri ile değiştirilebilir ... finallymaddeleri.)

Ancak, orada muhtemelen Java'nın en iyi performans gösteren uygulama ile veya bekleme ve haber vermeden, senkronize doğrudan kullanılmasını gerektirir algoritmaları.


Senkronize edilmekten vazgeçmenin, beklemenin ve bildirim yapmanın zamanı geldi mi?

Önceki sorunun cevabından bağımsız olarak, cevap kesinlikle hayırdır.

Bekle / bildir doğru şekilde kullanılabilir (ve sıklıkla kullanılır). Java'da, kullanımdan kaldırma sınıfları ve yöntemleri bozuldu; yani sürekli kullanımın acil bir durum olarak düzeltilmesi gerektiği durumlarda. Sun (ve şimdi Oracle) bir şeyi temel ve bekle / bildir olarak yaygın olarak kullandıysa, büyük miktarda eski kod için ciddi bir uyumluluk sorunu yaratırlardı. Bu kimsenin menfaatine DEĞİLDİR.

Kodunuzdaki senkronize edilmiş / bekle / bildirimden kurtulmak istiyorsanız, sorun değil. Ancak kullanımdan kaldırma, büyük miktarlarda temelde doğru olan çok iş parçacıklı kodun yeniden yazılmasını gerektirir ve bu bir KÖTÜ IDEA olacaktır. Kurumsal BT yöneticileri ve yazılım ürünü yöneticileri önerdiğiniz için sizden nefret ederdi ...


Java belgelerine göre "kullanımdan kaldırılmış" ın ne anlama geldiğini okumaya değer : http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html

Ayrıca, Java dilinin temelini oluşturan şeyleri kullanımdan kaldırdığımızdan da bahsettiğimizi unutmayın. Çekilmenin synchronizedçok büyük sonuçları var.


Aslında, hatırladığım kadarıyla, mükemmel “pratikte Java eşzamanlılığı” kitabına göre, java.util.concurrentutil sınıfları aslında daha hızlı. Perde arkasında bu sınıflar doğrudan VM ile konuşur; senkronize olarak nesne grafiğindeki nesneye kör bir kilit yükler ve böylece küresel performansı etkiler.
akuhn

Eğer gerçekten kaldırdığımızı düşündürürsem beni @Stephen affet synchronized. ark. Ben sadece gerçekten sadece yeni kod için bu kullanmama diyor diyor deprecation öneririm. Kaldırılmasını talep ettiğim eski kodun denenmesini ve test edilmesini önermeyi hayal etmem.
OldCurmudgeon

@OldCurmudgeon - oldukça geç bir yanıt, ancak kullanımdan kaldırmanın çok aşırı olduğunu düşünüyorum. 1) özelliği anlamına gelir olabilir çıkarılabilir. 2) Bu, sadece eski moda olmaktan farklı olarak, özelliğin bozulduğu anlamına gelir. 3) Birçok insan hala bu şekilde yeni kod yazmaktan memnundur ... ve yapmamaları için güçlü bir neden yoktur. 4) Cesaret kırmanın başka, daha az "yüzünüzde" yolları vardır; örneğin, PMD kuralları yazmak ...
Stephen C

@StephenC - O zaman sonuçta üniversitede kullanılmamasına veya öğretilmemesine yol açacak daha az dramatik bir eylem var mı? Onlardan açıkça kaçınılmalıdır. PMD kurallarının - iyi bir fikir olmasına rağmen - öğretmenlere çok hızlı ulaşamayacağından şüpheleniyorum.
OldCurmudgeon

1
@StephenC Bir nitpick: bağlandığınız Java belgelerine göre, kullanımdan kaldırılma, kullanımdan kaldırılan kodun bozulduğu anlamına gelmez. Bu bir nedendir, ancak belgelerin dediği gibi, daha yeni ve daha iyi bir API'nın yerini aldığında bir API kullanımdan kaldırılabilir (OP'nin iddia ettiği gibi, eşzamanlılık söz konusudur). Ve düşük seviyeli eşzamanlılık, aslında kötü uygulamaları teşvik etmiyorsa, kesinlikle çok hataya açıktır.
Andres F.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.