緩存一致性
happens-before(先行發生原則)
1)Java多線程情況下如何產生的一致性問題?
基於的硬件內存模型(包括CPU緩存和指令重排序)導致的
2)Java多線程下有哪些一致性問題?
CPU緩存導致的:緩存與內存數據的一致性問題;
指令重排序導致的:指令真正被執行順序與程序書寫的順序的一致性問題;
3)上述一致性問題帶來哪些編程上的問題?
多線程下併發的執行存在race condition的代碼,上述的不一致性問題會導致代碼執行結果的不確定性(隨機性)。
4)Java如何來解決上述所講的一致性問題?
通過一些方法來禁止CPU緩存和禁止指令重排序,具體方式如下:
保證程序的有序性
程序次序規則:一個線程內,按照代碼順序,書寫在前面的操作先行發生於書寫在後面的操作
鎖定規則:一個unLock操作先行發生於後面對同一個鎖的lock操作
volatile變量規則:對一個變量的寫操作先行發生於後面對這個變量的讀操作
傳遞規則:如果操作A先行發生於操作B,而操作B又先行發生於操作C,則可以得出操作A先行發生於操作C
線程啟動規則:Thread對象的start()方法先行發生於此線程的每個一個動作
線程中斷規則:對線程interrupt()方法的調用先行發生於被中斷線程的代碼檢測到中斷事件的發生
線程終結規則:線程中所有的操作都先行發生於線程的終止檢測,我們可以通過Thread.join()方法結束、Thread.isAlive()的返回值手段檢測到線程已經終止執行
對象終結規則:一個對象的初始化完成先行發生於他的finalize()方法的開始
更多Java 相關細節知識請《關注我》,歡迎評論歡迎轉發
閱讀更多 Java高併發框架 的文章