摘要:線程切換帶來的原子性問題我們把一個或者多個操作在執行的過程中不被中斷的特性稱為原子性。編譯優化帶來的有序性問題顧名思義,有序性指的是程序按照代碼的先后順序執行。
緩存導致的可見性問題
一個線程對共享變量的修改,另外一個線程能夠立刻看到,稱為可見性
在多核下,多個線程同時修改一個共享變量時,如++操作,每個線程操作的CPU緩存寫入內存的時機是不確定的。除非你調用CPU相關指令強刷。
線程切換帶來的原子性問題我們把一個或者多個操作在CPU執行的過程中不被中斷的特性稱為原子性。
高級語言里一條語句往往需要多條CPU指令完成。例如count += 1,至少需要三條CPU指令:
指令1:首先,需要把變量count從內存加載到CPU的寄存器;
指令2:之后,在寄存器中執行+1操作;
指令3:最后,將結果寫入內存(緩存機制導致可能寫入的是CPU緩存而不是內存)。
操作系統做任務切換,可以發生在任何一條CPU指令執行完,而不是高級語言里的一條語句。
編譯優化帶來的有序性問題顧名思義,有序性指的是程序按照代碼的先后順序執行。
public class Singleton { static Singleton instance; static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) instance = new Singleton(); } } return instance; } }
在new操作上,我們以為 的new操作應該是:
分配一塊內存M;
在內存M上初始化Singleton對象;
然后M的地址賦值給instance變量。
但是實際上優化后的執行路徑卻是這樣的:
分配一塊內存M;
將M的地址賦值給instance變量;
最后在內存M上初始化Singleton對象。
優化后會導致什么問題呢?我們假設線程A先執行getInstance()方法,當執行完指令2時恰好發生了線程切換,切換到了線程B 上;如果此時線程B也執行getInstance()方法,那么線程B在執行第一個判斷時會發現 instance != null ,所以直接返回 instance,而此時的instance是沒有初始化過的,如果我們這個時候訪問 instance 的成員變量就可能觸發空指針異常。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74998.html
摘要:有可能一個線程中的動作相對于另一個線程出現亂序。當實際輸出取決于線程交錯的結果時,這種情況被稱為競爭條件。這里的問題在于代碼塊不是原子性的,而且實例的變化對別的線程不可見。這種不能同時在多個線程上執行的部分被稱為關鍵部分。 為什么要額外寫一篇文章來研究volatile呢?是因為這可能是并發中最令人困惑以及最被誤解的結構。我看過不少解釋volatile的博客,但是大多數要么不完整,要么難...
摘要:因為管理人員是了解手下的人員以及自己負責的事情的。處理器優化和指令重排上面提到在在和主存之間增加緩存,在多線程場景下會存在緩存一致性問題。有沒有發現,緩存一致性問題其實就是可見性問題。 網上有很多關于Java內存模型的文章,在《深入理解Java虛擬機》和《Java并發編程的藝術》等書中也都有關于這個知識點的介紹。但是,很多人讀完之后還是搞不清楚,甚至有的人說自己更懵了。本文,就來整體的...
摘要:因為管理人員是了解手下的人員以及自己負責的事情的。處理器優化和指令重排上面提到在在和主存之間增加緩存,在多線程場景下會存在緩存一致性問題。有沒有發現,緩存一致性問題其實就是可見性問題。 網上有很多關于Java內存模型的文章,在《深入理解Java虛擬機》和《Java并發編程的藝術》等書中也都有關于這個知識點的介紹。但是,很多人讀完之后還是搞不清楚,甚至有的人說自己更懵了。本文,就來整體的...
摘要:內存模型是圍繞著在并發過程中如何處理原子性可見性和有序性這個特征來建立的,我們來看下哪些操作實現了這個特性。可見性可見性是指當一個線程修改了共享變量的值,其他線程能夠立即得知這個修改。 Java內存模型是圍繞著在并發過程中如何處理原子性、可見性和有序性這3個特征來建立的,我們來看下哪些操作實現了這3個特性。 原子性(atomicity): 由Java內存模型來直接保證原子性變量操作包括...
閱讀 2337·2021-11-16 11:52
閱讀 2323·2021-11-11 16:55
閱讀 750·2021-09-02 15:41
閱讀 2981·2019-08-30 15:54
閱讀 3142·2019-08-30 15:54
閱讀 2251·2019-08-29 15:39
閱讀 1507·2019-08-29 15:18
閱讀 968·2019-08-29 13:00