引言 上一篇文章聊到了Java內存模型,在其中我們說JMM是建立在happens-before(先行發生)原則之上的。 為什么這么說呢?因為在Java程序的執行過程中,編譯器和處理器對我們所寫的代碼進行了一系列的優化來提高程序的執行效率。這其中就包括對指令的“重排序”。 重排序導致了我們代碼 ...
happens before是JMM最核心的概念,理解happens before是理解JMM的關鍵。 一.JMM的設計 首先,讓我們先分析一下JMM的設計意圖。從JMM的設計者的角度,在設計JMM的時候要考慮一下兩個關鍵因素: .程序員對內存模型的使用。程序員希望內存模型易於理解 易於編程。程序員希望基於一個強內存模型來編寫代碼。 .編譯器和處理器對內存模型的實現。編譯器和處理器希望內存模型對 ...
2017-11-25 11:26 2 5909 推薦指數:
引言 上一篇文章聊到了Java內存模型,在其中我們說JMM是建立在happens-before(先行發生)原則之上的。 為什么這么說呢?因為在Java程序的執行過程中,編譯器和處理器對我們所寫的代碼進行了一系列的優化來提高程序的執行效率。這其中就包括對指令的“重排序”。 重排序導致了我們代碼 ...
可見,但是我們可以指定某些規則,這規則就是happens-before,從JDK 5 開始,JMM就使 ...
程序次序規則:一個線程內,按照代碼順序,書寫在前面的操作先行發生於書寫在后面的操作; 鎖定規則:一個unLock操作先行發生於后面對同一個鎖額lock操作; volatile變量規則:對 ...
Java 中 happens-before 原則,是在 JSR-133 中提出的。 原文摘要: • Each action in a thread happens-before every subsequent action in that thread. • An unlock ...
一、問題 一下代碼經測試,打開注釋行,子線程就不會陷入while死循環了,為什么呢 可以理解為:如果不加volatile,java編程語言的java memory model允許一個線程讀到另一個線程任何一次寫進去的值(可以是初值0也可以是主線程寫入 ...
一.happens-before原則 同一個線程中的,前面的操作 happens-before 后續的操作。(即單線程內按代碼順序執行。但是,在不影響在單線程環境執行結果的前提下,編譯器和處理器可以進行重排序,這是合法的。換句話說,這一是規則無法保證編譯重排和指令重排)。 1. 監視器 ...
本博客系列是學習並發編程過程中的記錄總結。由於文章比較多,寫的時間也比較散,所以我整理了個目錄貼(傳送門),方便查閱。 並發編程系列博客傳送門 本文是《深入Java虛擬機》的部分讀書筆記 如果Java內存模型中所有的有序性都僅靠volatile和synchronized來完成 ...
一. 指令重排 令重排序:java語言規范規定JVM線程內部維持順序化語義。即只要程序的最終結果 與它順序化情況的結果相等,那么指令的執行順序可以與代碼順序不一致,此過程叫指令的 重排序。 指令重排序的意義是什么? JVM能根據處理器特性 ...