回覆列表
-
1 # 程式猿來導事
-
2 # 一席話君
我將從syncrhoized notifyAll ReentrantLock這三個關鍵詞的角度談談
一.syncrhoized加鎖的執行緒的Object類的wait()/notify()/notifyAll()
1.wait()、notify()和notifyAll()方法是本地方法,並且為final方法,無法被重寫。
2.呼叫某個物件的wait()方法能讓當前執行緒阻塞,並且當前執行緒必須擁有此物件的monitor(即鎖)
3.呼叫某個物件的notify()方法能夠喚醒一個正在等待這個物件的monitor的執行緒,如果有多個執行緒都在等待這個物件的monitor,則只能喚醒其中一個執行緒;
4.呼叫notifyAll()方法能夠喚醒所有正在等待這個物件的monitor的執行緒
二.ReentrantLock類加鎖的執行緒的Condition類的await()/signal()/signalAll()
1.Condition是個介面,基本的方法就是await()和signal()方法;
2.Condition依賴於Lock介面,生成一個Condition的基本程式碼是lock.newCondition()
3. 呼叫Condition的await()和signal()方法,都必須在lock保護之內,就是說必須在lock.lock()和lock.unlock之間才可以使用
三.透過管道進行執行緒間通訊:1)位元組流;2)字元流
Java中有各種各樣的輸入、輸出流(Stream),其中管道流(pipeStream)是一種特殊的流,用於在不同執行緒間直接傳送資料。
一個執行緒傳送資料到輸出管道,另一個執行緒從輸入管道讀資料。
本人專注網際網路最新技術,大資料,資料採集,資料處理,資料治理,望交流!!
Java多執行緒間通訊方式主要有以下幾種方式:
1、同步透過synchronized關鍵字這種方式來實現執行緒間的通訊。
這種方式,本質上就是“共享記憶體”式的通訊。多個執行緒需要訪問同一個共享變數,誰拿到了鎖(獲得了訪問許可權),誰就可以執行。
2、while輪詢的方式執行緒Thread A如果改變了條件,執行緒Thread B不停地透過while語句檢測這個條件是否成立 ,從而實現了執行緒間的通訊。但是這種方式會浪費CPU資源。可以參照如下例子:
3、wait/notify機制wait()方法可以使執行緒進入等待狀態,而notify()可以使等待的狀態喚醒。這樣的同步機制十分適合生產者、消費者模式:消費者消費某個資源,而生產者生產該資源。
當該資源缺失時,消費者呼叫wait()方法進行自我阻塞,等待生產者的生產;生產者生產完畢後呼叫notify/notifyAll()喚醒消費者進行消費。
4、管道通訊管道通訊就是使用java.io.PipedInputStream &java.io.PipedOutputStream 和 PipedReader&PipedWriter,前兩種面向位元組,而後兩種面向字元。可以參照如下例子:
希望以上描述能夠幫助到你,可以一起交流和學習!