在執行程式時,為了提供效能,處理器和編譯器常常會對指令進行重排序,但是不能隨意重排序,不是你想怎麼排序就怎麼排序,它需要滿足以下兩個條件: 1.在單執行緒環境下無法改變程式運作的結果; 2. 存在資料依賴關係的不允許重排序如果看過LZ上篇部落格的就會知道,其實這兩點可以歸結於一點:無法透過happens-before原則推導出來的,JMM允許任意的排序。 as-if-serial語意as-if-serial語意的意思是,所有的操作都可以為了最佳化而重新排序,但是你必須確保重排序後執行的結果不能被改變,編譯器、runtime、處理器都必須遵守as-if-serial語意。注意as-if-serial只保證單執行緒環境,多執行緒環境下無效。下面我們用一個簡單的範例來說明:int a = 1 ;
1. 【死磕Java併發】-----Java記憶體模型之重排序
#簡介:執行程式時,為了提供效能,處理器和編譯器常常會對指令進行重排序,但是不能隨意重排序,不是你想怎麼排序就怎麼排序,它需要滿足以下兩個條件: 1. 在單線程環境下不能改變程序運行的結果; 2. 存在數據依賴關係的不允許重排序如果看過LZ上篇部落格的就會知道,其實這兩點可以歸結於一點:無法透過happens-before原則推導出來的,JMM允許任意的排序。 as-if-serial語意as-if-se
2. 【死磕Java並發】-----Java記憶體模型之happens-before
#簡介:在上篇部落格(【死磕Java並發】—–深入分析volatile的實作原理)LZ提到過由於存在線程本地記憶體和主記憶體的原因,再加上重排序,會導致多線程環境下存在可見性的問題。那我們正確使用同步、鎖的情況下,執行緒A修改了變數a何時對執行緒B可見?我們無法就所有場景來規定某個執行緒修改的變數何時對其他執行緒可見,但是我們可以指定某些規則,這規則就是happens-before,從JDK 5 開始,JMM就使用ha
3. 非阻塞同步演算法實戰(三)-LatestResultsProvider
########################################### #簡介:感謝trytocatch投遞本文。 前言 在閱讀本文前,需要讀者對happens-before比較熟悉,了解非阻塞同步的一些基本概念。本文主要為happens-before法則的靈活運用,和一些解決問題的小技巧,分析問題的方式。 背景介紹原始需求為:本人當時在寫一個正規替換工具############【相關問答推薦】:############java記憶體模型的happens- before語意順序問題######
以上是關於happens-before的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!