2012-09-26 11 views
8

Mam konsumenta i producenta, która dodaje i usuwa obiekty element z kolejki. Jeśli używam metod put() i take(). Czy są jeszcze jakieś problemy z bezpieczeństwem wątków, które muszę jeszcze uwzględnić? Jest to podobne do problemu związanego z ograniczonym buforem i zastanawiałem się, czy zamiast tego użycie kolejki blokującej zastąpi potrzebę użycia semaforów lub monitorów. Obiekt Item sam prawdopodobnie wymagałby synchronizacji (setters, ale gettery nie potrzebują blokady), czy mam rację? I wreszcie, nie jestem pewien, w jaki sposób sprawdzić, czy jest to bezpieczne, ponieważ nie może jednocześnie dokonać oba wątki wywołać take() wątek bo na kolejność wykonywania jest underterministic. Jakieś pomysły? Dzięki.Korzystanie z LinkedBlockingQueue wystarczająco dobre dla programu wielojęzykowego java?

+0

Chociaż kolejność wykonywania jest niedeterministyczny, to nie dowód, że LBQ nie jest wystarczająco dobry, gdyby niektóre przedmioty, które 'put()' 'nie są wyświetlane, lub ten sam przedmiot pojawia się wielokrotnie w wynikach z '' take() ''? –

+0

Sądzę, że jest to możliwy test, ale nie zawsze jest to test specyficzny dla wątku. Może przy użyciu wątku spać w trakcie wywoływania take(), podczas gdy inny wątek też to nazywa? – Dan

+0

To, co Executory używa domyślnie, co prowadzi mnie do pytania; nie możesz użyć usługi ExecutorService, która otacza kolejkę i pulę wątków? –

Odpowiedz

7

Jest całkowicie bezpieczny wątku za to, co robisz, w rzeczywistości jest to co to jest zaprojektowane. Opis BlockingQueue (który jest realizowany przez interfejs LinkedBlockingQueue) stwierdza:

implementacje BlockingQueue są thread-safe. Wszystkie metody kolejkowania uzyskują efekt atomowy przy użyciu wewnętrznych blokad lub innych form kontroli współbieżności.

1

Jednoczesne put() i podjąć() są niewątku bezpieczny ponieważ używać 2 różnych zamków.

to już odpowiedział tutaj: Are LinkedBlockingQueue's insert and remove methods thread safe?

+0

Podążyłem za linkiem i znalazłem odpowiedź na inny wpis wyjaśniający, dlaczego jest bezpieczny dla wątków. http://stackoverflow.com/questions/26543807/is-blockingqueue-completely-thread-safe-in-java/26543940#26543940 – user1266174

Powiązane problemy