訪問共享的可變資料

2021-10-10 21:40:20 字數 770 閱讀 3317

對可變共享資料的訪問如果不能同步,可能會出現預料之外的結果。但是下面這個例子就很容易導致誤判,且很多帖子上的解釋不是那麼的準確。

public class stopthread 

}});

thread.start();

timeunit.seconds.sleep(1);

stoprequested = true;

}}

上面這個例子大家再熟悉不過了,你可能會 覺得這個程式在執行大概1秒鐘左右之後,主線程將stoprequested設定為true,使執行緒thread中的迴圈終止。但是結果卻不會停止。

方案一大家可能會覺得之所以修改之前的程式不會終止,是因為變數stoprequested,是執行緒不可見的,主線程修改之後,子執行緒無法獲取修改後的值,其實這個解釋是錯誤的;反例就是解決方案二;

方案二也可以解決子執行緒無法終止的問題,可以反向證明stoprequested不是因為子執行緒不可見導致的;

其實真正的原因是jvm 將while迴圈做了轉變,即將**

while(!stoprequested)
轉變成這樣:

if(!stoprequested) 

}

這種優化稱作提公升(hoisting),這是hotshot jvm的工作模式。方案一中因為加了volatile之後,禁止jvm做指令重排序,不會出現上面的**轉變;方案二中增加列印也是為了禁止jvm進行**的轉變(因為println()方法是synchronized的);

目錄訪問共享C 怎麼訪問共享目錄

本文是一篇關於目錄訪問共享的帖子 用c 訪問共享目錄老是湧現許可權問題,讓人很頭疼,研究了良久找到一種方法,貼上 public class identityscope idisposable else finally protected virtual void dispose bool dispo...

訪問共享變數

啟動四個執行緒,兩個執行緒對i加1,兩個執行緒對i減1。如果多個執行緒共享同乙個變數,且對變數的操作相同,則可以通過實現runnable介面實現 為簡單起見,對方法進行同步,而不是對操作共享變數的 塊同步 public class main class myrun implements runnab...

10 共享訪問不到 如何訪問共享

一是在網路中,找到要訪問的那台電腦,雙擊開啟 二是直接在 開始 執行 中,輸入想要訪問的電腦的計算機名或ip位址。在網路中找到電腦訪問,需要同一區域網中的電腦數量要少於10臺,才好。如果電腦過多,這樣訪問就比較慢了。共享,先說下吧。就是說,我電腦中,有檔案,想要其他人的電腦可以看到,那麼,我可以建乙...