執行緒的未解之謎

2021-08-21 19:51:42 字數 1245 閱讀 1620

這是檢驗多執行緒可見性(volatile關鍵字)的時候發現的問題。請不要再迴圈中使用system.out.println();這種**,因為他是被synchronized修飾的,所以沒法用來檢測。有沒有大神能解釋一下,下面這些案例是什麼鬼???請不要說加volatile、synchronized能解決這種情況,這個應該大家都知道。我只想知道為什麼會出現在下面這幾個案例的情況。。。

執行時執行緒沒法結束,debug的時候執行緒1就能結束( f = isf中打斷點)???

class

mythread_volatile2

implements

runnable

system.out.println(thread.currentthread().getname() + "執行緒結束");

}}public

class

test_volatile2

}

將案例一種的迴圈中加入執行緒休眠一秒鐘,然後執行,發現執行緒1就能結束了???

class

mythread_volatile2

implements

runnable catch (interruptedexception e)

}system.out.println(thread.currentthread().getname() + "執行緒結束");

}}public

class

test_volatile2

}

可能有些人會說沒有用volatile修飾,執行緒之間本來就是不可見的,那請看一下這個案例,你可以去執行一下。。。如果說一直都是不可見的(也就是說一直都沒有去重新整理主記憶體,或者沒有去讀取最新的主記憶體),那這個案例的最後結果輸出的就是3個100。

class

mythread_volatile

implements

runnable else

isf = isf + 1;}}

}public

class

test_volatile

}

1、可能是主線程中的本地記憶體沒有重新整理到主記憶體中,但是debug的時候又能結束,所以這種猜想是不科學的。

2、主線程中的本地記憶體重新整理到主記憶體中了,可能是執行緒1讀取的是本地執行緒,沒有去讀取主記憶體,但是在迴圈中加入休眠一秒又能結束執行緒。

3、也可能是while這個關鍵字的問題。。。

未解之謎與已解之謎

使用連線符 輸出雙引號public class test 輸出單引號 直接寫當引號system.out.println class aritest num1和num2資料型別為int,所以經過除運算之後 的結果自動轉化為int 2 再 num2,所以輸出結果為10.同理double result3 ...

python 未解之謎

本人的 python numpy 安裝應該是沒有問題的 但是執行 機器學習系統設計 源 卻出了問題 原始碼如下 from sklearn.datasets import load iris import numpy as np data load iris features data data la...

CSS未解之謎

今天再幫同事除錯乙個樣式的問題時,我發現了乙個很神奇的現象,而其中的原由我個人卻不得而知,現記錄如下,待日後破解。123 奇怪的樣式表現如下 可以看到inner的margin bottom只有一半,另一半神奇的消失了,改變margin left的值,會發現margin bottom一起變化,當mar...