2015-07-22 8 views
6

Wydaje się, że wpływ na mechanizmy zarządzania współbieżnością, takie jak oczekiwanie/powiadomienie i blokada/warunek, ma wpływ spurious wakeups. Programiści reagują na te niespodziewane wybudzenia, ponownie sprawdzając, czy stan rzeczywiście się zmienił.Czy CountDownLatch ma wpływ na fałszywe wybudzenia?

Jeśli chodzi o CountDownLatch, czy fałszywe pobudki są problemem?

+0

Fałszywe pobudki to udokumentowane zachowanie_ oczekiwania/powiadomienia. Są _nie_ udokumentowane dla CountDownLatch. Jeśli CountDownLatch zachowuje się w sposób nieudokumentowany, byłby to błąd. Oznacza to, że jeśli zaimplementujesz CountDownLatch za pomocą wait/notify, to od Ciebie zależy, czy poprawnie podejmiesz fałszywe wybudzanie, a nie przekażesz pieniędzy swojemu klientowi. –

Odpowiedz

9

Javadoc z CountDownLatch#await() stanach

Jeśli aktualna liczba jest większa od zera, wówczas bieżący wątek staje wyłączone dla celów planowania wątek i drzemie aż jedna z dwóch rzeczy zdarzyć:

  • Licznik osiąga zero z powodu wywołań metody countDown(); lub
  • Niektóre inne wątki przerywają bieżący wątek.

nieaktywnych co oznacza, że ​​sposób ten nie powróci. Innymi słowy, chociaż może wystąpić fałszywe przebudzenie, nie spowoduje to powrotu metody.

Można spojrzeć na implementation aby zobaczyć, jak odbywa się to dokładnie, ale w skrócie, jest to typowa sztuczka z pętli i „czeka” (poprzez LockSuport#park lub Object#wait które są dotknięte przez fałszywych wybudzeń), dopóki warunek jest spełniony .

Jeśli chodzi o CountDownLatch, czy fałszywe pobudki są problemem?

nr

3

W Object.wait/Condition.await sposoby podlegają wybudzeń "fałszywych".

Sposób CountDownLatchawait będzie czekać aż

  • osiągnięciu wartości zera w wyniku wywołań odliczania() sposobu według wynalazku; lub Niektóre inne wątki przerywają bieżący wątek; lub Upłynie określony czas oczekiwania wynoszący .

Tak więc, gdy pojawi się fałszywe pobudki, ponieważ liczba nie została osiągnięta, nie powróci.

Tak więc synchronizatory takie jak CountDownLatch, CyclicBarrier itp. Nie podlegają fałszywym wybudzeniom.

Powiązane problemy