05.20 Java編程細節——緩存一致性問題總結

緩存一致性

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 相關細節知識請《關注我》,歡迎評論歡迎轉發


分享到:


相關文章: