03執行緒通訊

2021-10-06 08:54:37 字數 923 閱讀 3762

必須配合synchronized使用,wait方法釋放鎖,notify方法不釋放鎖(喚醒乙個等待執行緒)

如下**中,執行緒t1啟動,當main執行緒修改state引數為false時,t1執行緒應該跳出迴圈並列印變數 i 的值,

但執行發現並沒有,t1執行緒並沒有發現state引數被更改,原因是:

執行緒之間的共享變數儲存在主記憶體中,但每個執行緒都有乙個私有的本地記憶體,本地記憶體中儲存了該執行緒以讀/寫共享變數的副本。

public class threaddemo3 

system.out.println(i);}};

t1.start();

// main 執行緒修改state引數

try catch (interruptedexception e)

state=false;}}

意思就是說,在多執行緒環境下,某個共享變數如果被其中乙個執行緒給修改了,其他執行緒能夠立即知道這個共享變數已經被修改了,當其他執行緒要讀取這個變數的時候,最終會去記憶體中讀取,而不是從自己的工作空間中讀取

因為執行緒快取的存在,導致出現多執行緒中快取與記憶體不一致性的出現

解決方案 以下操作都會讓執行緒重新從主記憶體中更新變數

在變數前加關鍵字volatile

public volatile static boolean state=true;呼叫synchronize

while (state) }io操作new file("***.txt");執行緒睡眠sleep

底層實現 lock指令

03 程序通訊

程序通訊是指在程序間傳輸資料 交換資訊 程序是分配系統資源的單位 包括記憶體位址空間 因此各程序擁有的記憶體位址空間相互獨立,而且為了保證安全,乙個程序不能直接訪問另外乙個程序的位址空間。程序通訊分為三種方式 共享記憶體模式 訊息傳遞模式 共享檔案模式。程序通訊採用共享記憶體方式時,作業系統會在記憶...

執行緒通訊,多執行緒

多執行緒 thread handler thread處理一些複雜的業務邏輯 耗時的事情 handler在主線程中接收訊息的乙個物件 mhandler.sendmessage msg 傳送乙個訊息物件 mhandler.sendemptymessage what 傳送空訊息,只有what沒有obj m...

多執行緒 執行緒通訊

總結 今天小鹹兒來講解乙個好玩的事,那就是執行緒之間該如何通訊,執行緒通訊之後又會出現什麼問題?先來一張導圖來看看執行緒通訊的分布?疑問 如果想要執行緒按照使用者自定義的順序執行的話,那該如何操作呢?思考 如果能夠讓執行緒等待先執行的執行緒執行完,再執行不就能達到效果了嗎!果然出現問題之後,就會有對...