多執行緒 執行緒間通訊

2021-10-05 00:04:24 字數 1176 閱讀 2317

學習思路:

執行緒同步-鎖

wait、notify

join

threadlocal

通過管道輸入/輸出流(字元流、位元組流)

服務如果一直處於單執行緒訪問,那將毫無意義,多使用者訪問必然產生多執行緒,而多執行緒訪問必然離不開執行緒間通訊

多執行緒操作共享資源時勢必會產生執行緒安全的問題(也就是我們說的執行緒相互影響),而遇到執行緒安全問題我們最先想到的基本都是鎖,比如:syncrhoized、volatile、lock等;但這些個鎖都是基於單jvm來說是有效的,但就目前專案部署基本都是分布式集群部署,當然也就想到了分布式鎖

題外話:volatile相關資料請看之前部落格《多執行緒-執行緒安全-volatile》

wait、notify、nofifyall都是object的方法,呼叫過程:

執行緒a競爭拿到syncrhoized鎖(鎖物件x)後進入同步佇列

在syncrhoized內部呼叫物件x的wait方法,執行緒a釋放鎖,從同步佇列移到等待佇列

執行緒b在syncrhoized內部呼叫x物件的notify/notifyall方法,執行緒a從等待佇列移除,重新進入同步佇列,重新獲取鎖

注意:呼叫x.wait()之前x物件必須已經獲得鎖,呼叫notify/notifyall的前提是物件必須已經獲取到鎖,換句話說:wait()/notify/notifyall這三個方法必須在syncrhoized塊內呼叫

執行緒a內呼叫了執行緒b的join方法(呼叫a的wait方法),那麼執行緒a會等待執行緒b執行完後在繼續往下執行(呼叫a的notifyall方法)類似於a依賴於b的執行結果;跟上面的wait、notify不謀而合

顧名思義:執行緒跟本地變數繫結;為成員變數做乙個本地備份(本地變數)跟執行緒繫結,在操作的時候只操作本地變數的值,執行緒間互不影響;如set方法可以設定乙個值,get方法可以獲取乙個值

public void set(t value)
管道輸入 / 輸出流主要包括了如下四種具體實現:pipedoutputstream、pipedinputstream、pipedreader、pipedwriter,前兩種面向位元組,而後兩種面向字元

這裡的管道輸入輸出流跟檔案的/網路的輸入輸出流不同之處是:它是執行緒間基於記憶體的資料傳輸

多執行緒 執行緒間通訊

wait 方法的作用是使當前執行的執行緒進入等待,執行到 wait 一行進入等待 當執行緒被喚醒時從 wait 下一行開始執行。wait 方法需要在 synchronized 塊中呼叫,否則會報錯。wait 方法會釋放鎖,其它執行緒可以競爭獲得鎖 wait 方法有乙個帶時間引數的,當時間到了可以自動...

多執行緒3 執行緒間通訊

這兩種方法都要在同步 塊或同步方法中呼叫。都需要先獲得物件級別的鎖。只有兩個方法的物件鎖一致,即 物件監視器 一致,再能通過notify方法通知到執行wait方法的執行緒繼續執行。使用wait方法後,該執行緒會釋放物件鎖,並進入阻塞佇列等待被喚醒。notify方法喚醒wait方法後,該執行緒進入就緒...

142 多執行緒 執行緒間通訊

執行緒間通訊 其實就是多執行緒在操作同乙個資源。但是操作的動作不同 class res class input implements runnable public void run else x x 1 2 class output implements runnable public void ...