wait和 notify必須配合synchronized使用
乙個執行緒修改乙個物件的值,而另乙個執行緒則感知到了變化,然後進行相應的操作,這就是wait()、notify()和notifyall()方法的本質。具體體現到方法上則是這樣的:乙個執行緒a呼叫了物件obj的wait方法進入到等待狀態,而另乙個執行緒呼叫了物件obj的notify()或者notifyall()方法,執行緒a收到通知後從物件obj的wait方法返回,繼續執行後面的操作。
可以看到以上兩個執行緒通過物件obj進行操作,而wait和notify/notifyall的關係就像開關訊號一樣,用來完成等待方和通知方之間的互動工作。
下面的**演示了這個過程:分別建立乙個等待執行緒和乙個通知執行緒,前者檢查flag的值是否為false,如果符合要求就進行後續的操作,否則在lock上等待。後者在睡眠一段時間後對lock進行通知,等待執行緒這樣就可以從wait方法返回了
原部落格:
countdownlatch同樣能實現類似wait和 notify配合使用的功能
Java高併發程式設計筆記
jmm記憶體模型之 可見性 可見性是指當乙個執行緒修改了某乙個共享變數的值,其他執行緒是否能夠立即知道這個修改。jmm記憶體模型之 有序性 有序性問題的原因是因為程式在執行時,可能會出現指令重排,重排後的指令的順序未必一致。一條指令的執行可以分為很多步驟的 簡單來說就是以下幾步 1 取指if 2 解...
Java高併發程式設計之CountDownLatch
儘管這是挺好的解決辦法,當絕對談不上最佳,本篇文章進一步講解更優的解決方案。使用latch 門閂 替代wait notify來進行通知,其好處是通訊方式簡單,同時也可以指定等待時間。countdownlatch不涉及鎖定,當count的值為零的時候當前執行緒繼續執行。當不涉及同步,只是涉及執行緒通訊...
實戰Java高併發程式設計(三)JDK並發包
同步控制 重入鎖 重入鎖可以完全替代synchronized關鍵字。其使用方法如下 public reentrantlock lock new reentrantlock public void run finally 由於其通過人工進行lock和unlock,因此比synchronized更好控制...