高階java必須清楚的概念:原子性、可見性、有序性
原子性、可見性、有序性是多執行緒程式設計中最重要的幾個知識點,由於多執行緒情況複雜,如何讓每個執行緒能看到正確的結果,這是非常重要的。
原子性
原子性是指一個執行緒的操作是不能被其他執行緒打斷,同一時間只有一個執行緒對一個變數進行操作。在多執行緒情況下,每個執行緒的執行結果不受其他執行緒的干擾,比如說多個執行緒同時對同一個共享成員變數n++100次,如果n初始值為0,n最後的值應該是100,所以說它們是互不干擾的,這就是傳說的中的原子性。但n++並不是原子性的操作,要使用AtomicInteger保證原子性。
可見性
可見性是指某個執行緒修改了某一個共享變數的值,而其他執行緒是否可以看見該共享變數修改後的值。在單執行緒中肯定不會有這種問題,單執行緒讀到的肯定都是最新的值,而在多執行緒程式設計中就不一定了。
每個執行緒都有自己的工作記憶體,執行緒先把共享變數的值從主記憶體讀到工作記憶體,形成一個副本,當計算完後再把副本的值刷回主記憶體,從讀取到最後刷回主記憶體這是一個過程,當還沒刷回主記憶體的時候這時候對其他執行緒是不可見的,所以其他執行緒從主記憶體讀到的值是修改之前的舊值。
像CPU的快取優化、硬體優化、指令重排及對JVM編譯器的優化,都會出現可見性的問題。
有序性
我們都知道程式是按程式碼順序執行的,對於單執行緒來說確實是如此,但在多執行緒情況下就不是如此了。為了優化程式執行和提高CPU的處理效能,JVM和作業系統都會對指令進行重排,也就說前面的程式碼並不一定都會在後面的程式碼前面執行,即後面的程式碼可能會插到前面的程式碼之前執行,只要不影響當前執行緒的執行結果。所以,指令重排只會保證當前執行緒執行結果一致,但指令重排後勢必會影響多執行緒的執行結果。
雖然重排序優化了效能,但也是會遵守一些規則的,並不能隨便亂排序,只是重排序會影響多執行緒執行的結果。
相關文章
- Java併發之原子性、有序性、可見性Java
- java多執行緒3:原子性,可見性,有序性Java執行緒
- 你還不懂可見性、有序性和原子性?
- [深入理解Java虛擬機器]原子性/可見性/有序性Java虛擬機
- 執行緒安全性-原子性、可見性、有序性執行緒
- 三大性質總結:原子性、可見性以及有序性
- Java併發程式設計Bug源頭:可見性、原子性和有序性問題Java程式設計
- volatile,可見性,有序性
- 「跬步千里」詳解 Java 記憶體模型與原子性、可見性、有序性Java記憶體模型
- volatile 可見性與原子性
- 走進volatile的世界,探索它與可見性,有序性,原子性之間的愛恨情仇!
- Java併發程式設計-併發程式設計的Bug源頭:可見性、原子性和有序性問題Java程式設計
- java安全編碼指南之:可見性和原子性Java
- 深入理解Java多執行緒與併發框(第③篇)——Java記憶體模型與原子性、可見性、有序性Java執行緒記憶體模型
- 可見性有序性,Happens-before來搞定APP
- 你知道Java是如何解決可見性和有序性問題的嗎?Java
- Java併發程式設計-解決可見性與有序性問題Java程式設計
- 從硬體級別再看可見性和有序性
- 高階JAVA碼農必須搞清楚它們的區別:instanceof、isInstance、isAssignableFromJava
- Java併發程式設計實戰 02Java如何解決可見性和有序性問題Java程式設計
- 【Java併發入門】02 Java記憶體模型:看Java如何解決可見性和有序性問題Java記憶體模型
- 高階 Java 必須突破的 10 個知識點!Java
- 高階Java必須突破的10個知識點!Java
- 淺談併發的資料競爭(可見性)與競態條件(原子性)
- 併發程式設計的原子性 != 事務ACID的原子性程式設計
- PostgreSQL vacuum可見性SQL
- Unsafe原子性
- JSON 屬性必須用雙引號JSON
- Volatile可見性分析(一)
- Java併發程式設計-volatile可見性的介紹Java程式設計
- JS高階之面試必須知道的幾個點JS面試
- java編碼:保證方法呼叫鏈的原子性Java
- 關於IOS 屬性atomic(原子性)的理解iOS
- 你必須搞清楚的String,StringBuilder,StringBufferUI
- CSS中那些必須掌握的概念CSS
- PostgreSQL MVCC可見性判斷SQLMVC
- Kotlin可見性修飾符Kotlin
- 關於HDFS的資料可見性