2012-09-26 7 views
8

Öğe nesnelerini sıraya ekleyen ve silen bir tüketici ve üretici var. put() ve take() yöntemlerini kullanırsam. Hala ele almam gereken diş ipi güvenliği sorunları var mı? Bu, sınırlı arabellek sorununa benzer ve engelleme sırasını kullanmanın yerine semafor veya monitör gereksiniminin yerini aldığını merak ettim. Öğe nesnesinin kendisi muhtemelen senkronizasyona ihtiyaç duyacaktır (ayarlayıcılar ancak alıcılar kilitlemeye ihtiyaç duymaz), doğru muyum? Ve son olarak, ipliğin güvenli olup olmadığını test edemiyorum, çünkü her iki iş parçacığı aynı anda take() aramasını yapamıyorum çünkü yürütme sırasının yetersiz olması nedeniyle. Herhangi bir fikir? Teşekkürler.LinkedBlockingQueue kullanımı çok iş parçacığı java programı için yeterince iyi mi?

+0

yürütme sırasını nondeterministic iken, olur değil kanıt LBQ yeterince iyi olmasından kaynaklanıyor Eğer '' koymak() '' görünmez bazı öğeler ise, ya da aynı öğe kalemi ''() '' sonuçlarından tekrar tekrar ortaya çıkıyor mu? –

+0

Sanırım bu olası bir test ama her zaman belirli bir test olmayabilir. Belki de diğer iş parçacığı çağırırken çağrı alma() ortasında iplik uyku kullanarak? – Dan

+0

Yürütücünün varsayılan olarak kullandığı, beni soruya yönlendiren; Kuyruk ve iş parçacığı havuzu saran bir ExecutorService kullanamazsınız? –

cevap

7

Yaptığınız şey için mükemmel bir iş parçacığıdır, aslında bunun için tasarlandığı şey budur. BlockingQueue açıklaması (LinkedBlockingQueue tarafından uygulanan arayüzü olan) belirtir:

BlockingQueue uygulamaları evreli vardır. Tüm sıraya koyma yöntemleri , eşzamanlılık denetiminin iç kilitleri veya diğer formları kullanarak atomik olarak etkilerini gerçekleştirir. Onlar 2 farklı kilitler kullandıkları için

1

Eşzamanlı koymak() ve almak() değilevrelibulunmaktadır.

Bu zaten burada cevaplanır: Are LinkedBlockingQueue's insert and remove methods thread safe?

+0

Bağlantıyı takip ettim ve neden parçanın güvenli olduğunu açıklayan başka bir gönderiye cevap buldum. http://stackoverflow.com/questions/26543807/is-blockingqueue-completely-thread-safe-in-java/26543940#26543940 – user1266174