Bu soru daha iyi bir cevabı hak ediyor.
Java en ConcurrentLinkedQueue
ünlü dayanmaktadır Maged M. Michael ve Michael L. Scott tarafından algoritması için engellenmeyen kilidi serbest sıralar.
Burada bir tartışmalı kaynak (kuyruğumuz) için bir terim olarak "bloke olmama", platformun zamanlayıcısının ne yaptığından bağımsız olarak, bir iş parçacığını kesmek gibi veya söz konusu iş parçacığı çok yavaşsa, aynı kaynak için rekabet eden diğer iş parçacığı anlamına gelir. yine de ilerleyebilecek. Örneğin bir kilit söz konusuysa, kilidi tutan iplik kesilebilir ve bu kilidi bekleyen tüm iplikler engellenebilir. synchronized
Java'daki içsel kilitler ( anahtar kelime) de performans için ciddi bir ceza ile gelebilir - önyargılı kilitlemede olduğu gibiişin içindeyse ve tartışmanız varsa veya VM, bir döndürme yetkisiz kullanım süresinden sonra kilidi "şişirmeye" karar verdikten ve rekabet eden konuları engellemeye karar verdikten sonra ... bu nedenle birçok bağlamda (düşük / orta çekişme senaryoları) karşılaştırma yapmak ve -Atomik referanslar üzerindeki ayarlar çok daha verimli olabilir ve bu, engellemeyen birçok veri yapısının yaptığı şeydir.
Java ConcurrentLinkedQueue
sadece engelleyici değildir, aynı zamanda üreticinin tüketiciyle rekabet etmediği harika bir özelliğe sahiptir. Tek bir üretici / tek tüketici senaryosunda (SPSC), bu gerçekten konuşulacak bir çekişme olmayacağı anlamına gelir. Çoklu üretici / tek tüketici senaryosunda, tüketici üreticilerle rekabet etmeyecektir. Bu kuyruk, birden fazla üretici denediğinde çekişmeye neden olur offer()
, ancak bu, tanım gereği eşzamanlılıktır. Temelde genel amaçlı ve verimli, engellemeyen bir kuyruktur.
Bir olmama gelince BlockingQueue
kuyrukta beklemek için bir iş parçacığı engelleme, iyi, eşzamanlı sistemlerin tasarlanması bir freakishly korkunç bir yoldur. Yapma. ConcurrentLinkedQueue
Bir tüketici / üretici senaryosunda a'yı nasıl kullanacağınızı çözemezseniz, o zaman iyi bir aktör çerçevesi gibi daha yüksek seviyeli soyutlamalara geçin.