對於課堂上講的多執行緒的乙個問題的總結和思考

2021-09-24 12:39:04 字數 882 閱讀 9604

public class pin

3. return simulator;

}

兩個程序同時執行這段程式,當乙個程序1執行語句1,另乙個程序2執行語句2的時候,程序2不會影響程序1.

我聽課的時候沒能理解,程序2不是已經把simulator的值從null改變了嗎,程序1在執行語句1的時候就會收到影響了。

有乙個不正確的的解釋是,程序2是用棧中乙個區域性變數p管理simulator的值,程序2一直對棧中的區域性變數進行操作,在執行完語句3(即整個程序2結束)之後才把p寫入到simulator,所以程序1不會受到影響。

可是我對於這個解釋還是不能理解。如果只有當程序2結束的時候才把simulator新的值寫入,那麼上堂課的時候還講過乙個例子

x初始值是1,

程序1執行x *2 ,x * 3,程序2執行x * 5就不會得到10的結果了。實際上在程序1沒有執行完,就把第一步計算的x =2寫入到static的全域性變數x裡面了,然後程序2讀到x算出結果10.

並沒有像之前解釋的那樣,程序1計算的中間結果2不寫入,直到程序1執行結束才寫入。

經過我的查閱,發現事實上乙個執行緒把資料寫入堆的時間是我們判定不了的。

simulator = new pin();

所以,以上的程式,執行緒1可能受到執行緒2的影響,執行緒2在new 乙個新的simulator之後,把新的引用的位址賦給區域性變數p,然後有可能在把p寫入到堆中之後執行緒1才去執行語句1,這個時候讀到的不是null了,這樣的話是我們期望的結果,執行緒1不再new 乙個新的了。

但是也有可能執行緒2執行語句2之後,還沒能把新的引用的位址寫入,這個時候執行緒1執行語句1,讀到的就是null,這時候執行緒1就會受到的影響,他也要new 乙個新的物件。

乙個有趣的多執行緒問題

師弟問了個非常有趣的多執行緒問題,之前沒有關注,這裡寫下自己的心得。對於如下 include include include uint winapi fun1proc lpvoid lpparameter uint winapi fun2proc lpvoid lpparameter int ind...

請教乙個多執行緒的的問題

我用c 寫了乙個多執行緒的程式 這個程式開很多埠接收資料,每個埠分配了乙個執行緒接受 每個接受執行緒對應還有乙個執行執行緒,執行一些需要阻塞的函式 我接受網路的執行緒用迴圈的方式察看是否有資料。每個迴圈用thread.suspend 掛起 同樣,配套的阻塞程序也在不停迴圈,每個迴圈thread.su...

乙個多執行緒同步問題

昨天,路過的時候,發現了這個問題 class syncclass catch exception e system.out.println class test implements runnable public void run 輸出結果如圖 其實synchronized void synmth...