java多線程 可見性 原子性 有序性及問題所在

可見性:

我們的數據統一存儲到我們的JMM的主內存當中。假如說同時有多個線程進來訪問,那麼我們多個線程並不是直接對主內存的數據進行修改
而是把各個數據拷貝到自己的工作內存當中,對其修改完再放回給主內存。這時並通知其他線程 這就是我們說的可見性。
JMM:java內存模型 一種抽象的內存模型 並不真實存在。
在這裏插入圖片描述

原子性:

如我們一個簡單的n++的命令在底層字節碼文件裏其實是四個命令。如果加了volatile即使保證了我們的可見性。但是在線程t1在執行第7步的時候被掛起了,線程t2對值進行了修改,那麼t1在拿到cpu調度權的一瞬間直接就把數據寫入到了內存。不保證原子性就會出現寫丟失的情況。所以我們在多線程的情況下一定要保證可見性,原子性
AtomicInteger atomicInteger = new AtomicInteger(); 這個是保證了原子性的一個Integer類型
在這裏插入圖片描述

有序性:

計算機在執行程序時,爲了提高性能,會把我們寫的程序的命令按照最優的方式把指令進行重排
源代碼—>編譯器優化的重排—>指令並行的重排—>內存系統的重排—>最終執行的命令。
但是重排時必須要考慮到指令之間的數據依賴性 所以我們在多線程環境下要避免指令進行重新排序 這就是有序性
在這裏插入圖片描述
我們的volatile實現了禁止指令重排的優化,從而避免了多線程環境下程序出現亂序的現象

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