JAVA線程的工作內存

首先,先傳代碼,有圖片,也有文件,看不清的朋友可以直接下載文件回去跑一下,感受一下。



我解釋一下吧,大概意思就是在一個線程裏面不斷的跑,如果a=0,就把a加到5,然後建立子線程,再在子線程裏面把a減到0。預想的結果是這個循環會無限的執行打印語句,但是事實上,並沒有。因爲進不去 if 語句。也就是說,雖然子線程把a減到了0,主存中的a等於0,但是在main裏面new出來的線程裏面的a不等於0。

這是線程的工作內存問題,不知道工作內存的去百度吧,這裏就不贅述了。我直接說解決方案吧:

多線程中的變量,都要上鎖,無論是讀還是寫。在線程進入synchronized塊之前,會把工作存內存中的所有內容映射到主內存上,然後把工作內存清空再從主存儲器上拷貝最新的值。而在線程退出synchronized塊時,同樣會把工作內存中的值映射到主內存(例子是因爲if中的讀操作沒有用synchronized,導致數據不一致)

讀如果不上鎖也行,但是a變量要聲明爲volatile。

使用atomic包,簡單粗暴





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章