Gibt es in Java „Spurious Wakeups“?
Das Konzept der „Spurious Wakeups“ in Java hat zahlreiche Diskussionen ausgelöst, die bei einigen dazu geführt haben, dass diese in Frage gestellt werden tatsächliches Auftreten.
Was verursacht falsche Wakeups?
Unechte Wakeups haben per Definition keine offensichtlichen Auslöser, aber eine mögliche Ursache sind Systemsignale, insbesondere unter Linux. Wie im Wikipedia-Artikel erläutert, kann die Linux-Implementierung von pthread_cond_wait() mithilfe des futex-Systemaufrufs zu einem falschen Aufwachen führen, wenn ein Prozess ein Signal empfängt. Da jeder blockierende Systemaufruf mit EINTR ein Signal zurückgibt, ist es möglich, dass pthread_cond_wait() außerhalb des Futex-Aufrufs ein echtes Aufwecken verpasst. Um diese Race-Bedingung zu vermeiden, muss der Aufrufer nach einer Invariante suchen. Folglich kann jedes POSIX-Signal ein falsches Aufwecken auslösen.
Beispiel
Betrachten Sie den folgenden Code:
<code class="java">public class Spurious { public static void main(String[] args) { Lock lock = new ReentrantLock(); Condition cond = lock.newCondition(); lock.lock(); try { try { cond.await(); System.out.println("Spurious wakeup!"); } catch (InterruptedException ex) { System.out.println("Just a regular interrupt."); } } finally { lock.unlock(); } } }</code>
In diesem Szenario ein Spurious Das Aufwachen kann simuliert werden, indem ein Signal an den Prozess gesendet wird, wodurch der wartende Thread vorzeitig erwacht.
Das obige ist der detaillierte Inhalt vonSind falsche Wakeups in Java ein Mythos?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!