2012-05-21 10 views
9

Capisco che Thread.currentThread().yield() è una notifica per infilare scheduler che può assegnare ciclo CPU a qualche altro filo della stessa priorità se tale è presente. La mia domanda è: Se il thread corrente ha il blocco su qualche oggetto e chiama yield(), perderà immediatamente il blocco? E quando lo schedulatore scopre che non esiste un thread di questo tipo per assegnare il ciclo della CPU, allora il thread che ha chiamato yield() sarà di nuovo in lotta per ottenere il blocco dell'oggetto che ha perso prima ??Does thread.yield() perde il blocco sull'oggetto se chiamato all'interno di un metodo sincronizzato?

Non riesco a trovarlo in javadoc e nei forum [http://www.coderanch.com/t/226223/java-programmer-SCJP/certification/does-sleep-yield-release-lock] avere 50- 50 risposte.

Penso che yield() (diciamo thread1) dovrebbe rilasciare il blocco perché se qualche thread (diciamo thread2) della stessa priorità vuole operare sullo stesso oggetto, allora può avere la possibilità che il programma di pianificazione dei thread alla fine assegni a thread2 thread2.

risposta

14

No. Thread.yield() non è come Object.wait(). Lascia solo il controllo per consentire un interruttore di filo. Non avrà alcun effetto sulla concorrenza del tuo programma.

v'è alcuna garanzia che filo lo scheduler verrà eseguita dopo una resa.

+2

dovremmo concludere quindi che chiedere un thread cedere durante l'esecuzione di una parte di codice sincronizzato non è una buona idea? Dopotutto, per minimizzare il tempo in cui il blocco è trattenuto, vorresti che il tuo thread in esecuzione finisse il blocco il prima possibile, e produci, anche il solo suggerimento, se preso in considerazione, ritarderebbe solo il rilascio del blocco. –

+1

@edalorzo Concordato. È inutile. Perché richiedere il blocco solo per rimandare cortesemente all'altro thread? – EJP

+0

Dipende veramente dall'applicazione, ma in generale yield() non è necessario. Voglio dire, se ci fosse un lavoro richiesto da un altro thread nella serratura, allora dovrà essere fatto. –

7

In Java Language specification
17.3 sonno e rendimento
È importante notare che né Thread.sleep né Thread.yield hanno alcuna semantica di sincronizzazione. In particolare, il compilatore non deve irrigare scritture memorizzate nella cache in registri fuori a memoria condivisa prima di una chiamata a Thread.Sleep o Thread.yield, né il compilatore necessario ricaricare valori memorizzati nella cache in registri dopo una chiamata al Thread.Sleep o Discussione .dare la precedenza.

Il mio commento:

Nei primi giorni di Java, quando non ha in realtà supportato esecuzioni parallele, ma solo simultanei (fili verdi), yield() sospendeva il thread corrente, e la JVM stava raccogliendo un altro thread a curriculum vitae. Oggigiorno, yield non ha molto significato come di solito la pianificazione del battistrada è a livello di sistema operativo.

Quindi, yield è solo un suggerimento per la JVM che il thread corrente vuole riposarsi e nient'altro, spetta allo scheduler dei thread decidere cosa fare. yield non ha alcuna semantica di sincronizzazione. Se il thread rimane bloccato, continuerà a tenerlo.

+0

Attualmente sto lavorando sul mio SCJP 1.6 e ho fatto un test come richiesto per la certificazione dove c'è una chiamata di rendimento all'interno di un Funzione sincronizzata e rende l'esecuzione ad un altro thread. – Salsero69

+0

@Op De Cirkel Grazie! che ne dici di unirti? Anche questo si comporta allo stesso modo? –

0

aspettare solo metodi della classe Object rilascio della serratura intrinseca dell'istanza corrente (il filo potrebbe avere altre serrature acquisite, essi non vengono rilasciati). Resa, dormi, unisciti non preoccuparti delle serrature. Tuttavia, il join è un po 'più speciale, ti garantiamo di vedere tutte le modifiche apportate dal thread che stai aspettando di terminare.

Problemi correlati