Adakah Spurious Wakeups di Java Wujud?
Konsep "spurious wakeups" di Jawa telah mencetuskan banyak perbincangan, menyebabkan sesetengah pihak mempersoalkan kejadian sebenar.
Apa yang Menyebabkan Wakeup Palsu?
Wakeup palsu mengikut definisi kekurangan pencetus yang jelas, tetapi satu punca yang mungkin adalah isyarat sistem, terutamanya di bawah Linux. Seperti yang dijelaskan oleh artikel Wikipedia, pelaksanaan pthread_cond_wait() Linux menggunakan panggilan sistem futex boleh mengakibatkan bangun palsu apabila proses menerima isyarat. Memandangkan setiap panggilan sistem menyekat kembali dengan EINTR pada isyarat, pthread_cond_wait() mungkin terlepas bangun yang tulen semasa berada di luar panggilan futex. Untuk mengelakkan keadaan perlumbaan ini, pemanggil mesti menyemak invarian. Akibatnya, sebarang isyarat POSIX boleh mendorong bangun palsu.
Contoh
Pertimbangkan kod berikut:
<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>
Dalam senario ini, palsu wakeup boleh disimulasikan dengan menghantar isyarat kepada proses, menyebabkan benang menunggunya mengalami kebangkitan pramatang.
Atas ialah kandungan terperinci Adakah Wakeup Palsu di Jawa Mitos?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!