2015-07-22 5 views
6

I meccanismi di gestione della concorrenza quali attesa/notifica e blocco/condizione sembrano essere interessati da spurious wakeups. Gli sviluppatori provvedono a tali risvegli imprevisti ricontrollando che la condizione è effettivamente cambiata.CountDownLatch è interessato da wakeup spurie?

Quando si parla di CountDownLatch, i wake-up spuri sono un problema?

+0

Sveglie spurie sono un comportamento _documentato_ di attesa/notifica. Sono _not_ documentati per CountDownLatch. Se un CountDownLatch si comporta in modo non documentato, questo sarebbe un bug. Vale a dire, se si implementa CountDownLatch usando wait/notify, allora spetta a voi gestire correttamente un wake spurie e non passare il buck al client. –

risposta

9

Javadoc di CountDownLatch#await() stati

Se il valore attuale è maggiore di zero, allora il thread corrente viene disabilitato per scopi di pianificazione filo e si trova in sospeso fino a quando una delle due cose accada:

  • Il conteggio raggiunge zero a causa di invocazioni del metodo countDown(); oppure
  • Alcuni altri thread interrompono il thread corrente.

dormiente significa che il metodo non tornerà. In altre parole, sebbene si possa verificare una sveglia spuria, non restituirà il metodo await.

Potete guardare il implementation per vedere come si fa esattamente, ma, in breve, è il trucco tipico dei loop e "attesa" (attraverso LockSuport#park o Object#wait che sono affetti da wakeups spuri) fino a quando una condizione è soddisfatta .

Quando si tratta di CountDownLatch, i wake-up spuri sono un problema?

No.

3

I Object.wait/Condition.await metodi sono soggetti a "wakeups spurie".

Procedimento await in CountDownLatch attenderà

  • il conteggio raggiunge zero a causa invocazioni del conto alla rovescia() metodo; o Alcuni altri thread interrompe il thread corrente; o Scade il tempo di attesa specificato .

Quindi, anche se si verifica un riattivazione spuria, poiché il conteggio non ha raggiunto, non verrà restituito.

Quindi i sincronizzatori come CountDownLatch, CyclicBarrier ecc. Non sono soggetti a wakeups spuri.