Cosa succede se si notifica un blocco eavvisare immediatamente il blocco? Supponiamo che ci siano 2 o più thread in attesa su quel blocco. È garantito che due thread vengano riattivati? Oppure è possibile che solo un thread venga riattivato, il che significa che la seconda notifica diventa obsoleta?
lock.notify();
lock.notify();
Grazie!
risposte:
5 per risposta № 1Supponiamo che ci siano 2 o più thread in attesa su quel blocco. È garantito che due thread vengano riattivati?
Sì. Ogni notifica prende una discussione dalla coda di attesa e la inserisce nella coda bloccata - il thread sveglia deve prima ottenere l'accesso alla synchronized
blocco in questione. Se c'è solo 1 filo in attesa sul lucchetto, il secondo notify()
non farei niente
È importante rendersi conto che il filo sarà non inizia a eseguire immediatamente. Dal momento che doveva essere in a synchronized
bloccare lock
essere in grado di fare il wait()
deve accedere a lock
ancora prima che possa funzionare. Potrebbero esserci più altri thread già nella coda dei blocchi, in attesa di accesso lock
.
0 per risposta № 2
Sospetto che il comportamento sarebbe simile alla chiamata a notifyAll () (in questo caso è più simile a notifyTwo ())
I fili risvegliati competeranno nel solitomodo con qualsiasi altro thread che potrebbe competere attivamente per la sincronizzazione su questo oggetto; ad esempio, i thread risvegliati non godono di alcun privilegio o svantaggio affidabile nell'essere il thread successivo per bloccare questo oggetto.