多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用
線程通信-wait和notify方法介紹:
java.lang.Object類提供類兩類用于操作線程通信的方法.
wait():執行該方法的線程對象釋放同步鎖,JVM把該線程存放到等待池中,等待其他的線程喚醒該線程.
notify:執行該方法的線程喚醒在等待池中等待的任意一個線程,把線程轉到鎖池中等待.
notifyAll():執行該方法的線程喚醒在等待池中等待的所有的線程,把線程轉到鎖池中等待.
注意:上述方法只能被同步監聽鎖對象來調用,否則報錯IllegalMonitorStateException..
------------------------------------------
假設A線程和B線程共同操作一個X對象(同步鎖),A,B線程可以通過X對象的wait和notify方法來進行通信,流程如下:
1:當A線程執行X對象的同步方法時,A線程持有X對象的鎖,B線程沒有執行機會,B線程在X對象的鎖池中等待.
2:A線程在同步方法中執行X.wait()方法時,A線程釋放X對象的鎖,進入A線程進入X對象的等待池中.
3:在X對象的鎖池中等待鎖的B線程獲取X對象的鎖,執行X的另一個同步方法.
4:B線程在同步方法中執行X.notify()方法時,JVM把A線程從X對象的等待池中移動到X對象的鎖池中,等待獲取鎖.
5:B線程執行完同步方法,釋放鎖.A線程獲得鎖,繼續執行同步方法.
線程通信-使用Lock和Condition接口:
wait和notify方法,只能被同步監聽鎖對象來調用,否則報錯IllegalMonitorStateException.
那么現在問題來了,Lock機制根本就沒有同步鎖了,也就沒有自動獲取鎖和自動釋放鎖的概念.
因為沒有同步鎖,所以Lock機制不能調用wait和notify方法.
解決方案:Java5中提供了Lock機制的同時提供了處理Lock機制的通信控制的Condition接口.
--------------------------------------------------------------------
從Java5開始,可以:
????? 1):使用Lock機制取代synchronized代碼塊和synchronized 方法.
????? 2):使用Condition接口對象的await,signal,signalAll方法取代Object類中的wait,notify,notifyAll方法.
總結
以上是生活随笔為你收集整理的多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux网络编程--文件描述符
- 下一篇: 爬虫遇到路径转换的解决方案