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.
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. –
@edalorzo Concordato. È inutile. Perché richiedere il blocco solo per rimandare cortesemente all'altro thread? – EJP
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. –