2012-02-11 11 views

risposta

4

Secondo il Java documentation for notify():

sveglia un singolo processo in attesa sul monitor di questo oggetto. Se qualsiasi thread è in attesa su questo oggetto, uno di questi viene scelto come risvegliato. La scelta è arbitraria e si verifica a discrezione dell'implementazione . Un thread attende sul monitor di un oggetto chiamando uno dei metodi di attesa.

Quindi, se si utilizza synchronized(obj){} che, fondamentalmente, non hanno alcun controllo su quale thread otterrà il blocco su obj, e non si può fare alcuna ipotesi. Dipende dallo schedulatore.

Se si desidera l'equità (ovvero il thread successivo che ottiene il blocco è il primo della coda), dare un'occhiata a ReentrantLock: ha un flag booleano per specificare che si desidera applicare equità.

+0

Grazie. Inoltre, sembra che il blocco sincronizzato (obj) invochi anche wait(), potresti delineare la catena di azioni che vengono eseguite prima, durante e dopo il blocco sincronizzato o i metodi – itsraja

+0

Cosa intendi? L'algoritmo utilizzato per garantire l'esclusione reciproca su un pezzo di codice? O l'algoritmo di programmazione? Per il primo, solo concettualmente, si consiglia di dare un'occhiata all'algoritmo di Peterson: https://en.wikipedia.org/wiki/Peterson's_algorithm. Per quest'ultimo, è discusso qui: http://stackoverflow.com/questions/2816011/what-is-the-jvm-scheduling-algorithm –

+0

Grazie. Intendevo l'esclusione reciproca in termini di metodi di Java. come wait(), notify() ... Sarò felice di vedere una sequenza di queste chiamate di funzione simulate per 2 thread che provano per 1 oggetto. Ehi, questo è analogo a 2 (o più) ragazzi che propongono 1 ragazza. Lo chiamano matrimonio;) – itsraja

0

Secondo Java Oracle Docs:

Il costruttore per questa classe accetta un parametro di equità opzionale. Se impostato true, in conflitto, i blocchi preferiscono la concessione dell'accesso al thread con l'attesa più lunga. Altrimenti questo blocco non garantisce alcun ordine di accesso particolare.

Se si concede l'equità, viene utilizzato FIFO (First-in-First-out), altrimenti sembra casuale (dalle mie osservazioni).

+0

si presume che utilizzi ReentrantLock ... ha solo detto "fili in competizione per un blocco sullo stesso oggetto", che potrebbe essere qualsiasi Oggetto IMHO –

Problemi correlati