眾所周知,無限制下多線程操作共享變量是危險的,為了保證線程安全語義,一般的建議是在操作共享變量時加鎖,比方說在用synchronized關鍵字修飾的方法內讀寫共享變量。 但是synchronized開銷較大,有沒有更輕量更優雅的解決方案呢? volatile是輕量級 ...
一 內存模型的相關概念 大家都知道,計算機在執行程序時,每條指令都是在CPU中執行的,而執行指令過程中,勢必涉及到數據的讀取和寫入。由於程序運行過程中的臨時數據是存放在主存 物理內存 當中的,這時就存在一個問題,由於CPU執行速度很快,而從內存讀取數據和向內存寫入數據的過程跟CPU執行指令的速度比起來要慢的多,因此如果任何時候對數據的操作都要通過和內存的交互來進行,會大大降低指令執行的速度。因此在 ...
2017-07-30 14:16 3 2150 推薦指數:
眾所周知,無限制下多線程操作共享變量是危險的,為了保證線程安全語義,一般的建議是在操作共享變量時加鎖,比方說在用synchronized關鍵字修飾的方法內讀寫共享變量。 但是synchronized開銷較大,有沒有更輕量更優雅的解決方案呢? volatile是輕量級 ...
volatile是什么 volatile在java語言中是一個關鍵字,用於修飾變量。被volatile修飾的變量后,表示這個變量在不同線程中是共享,編譯器與運行時都會注意到這個變量是共享的,因此不會對該變量進行重排序。上面這句話可能不好理解,但是存在兩個關鍵,共享和重排序。 變量的共享 ...
本文大綱 1. 重排序2. volatile的特性3. happens-before 3.1 線程內的happens-before 3.2 線程間的happens-before4. JMM底層實現原理 1. 重排序 首先,我們來看一段代碼: 上面這段代碼中,x、y ...
在java線程並發處理中,有一個關鍵字volatile的使用目前存在很大的混淆,以為使用這個關鍵字,在進行多線程並發處理的時候就可以萬事大吉。 Java語言是支持多線程的,為了解決線程並發的問題,在語言內部引入了 同步塊 和 volatile 關鍵字機制。 synchronized ...
在一些開源的框架的源碼當中時不時都可以看到volatile這個關鍵字,最近特意學習一下volatile關鍵字的使用方法。 很多資料中是這樣介紹volatile關鍵字的: 文字不太好理解,通過例子來理解。 1、例子 首先看一個沒有使用volatile關鍵字例子: 該例子中定義了一個 ...
閱讀目錄 一、基本概念 二、Volatile原理 一、基本概念 先補充一下概念:Java 內存模型中的可見性、原子性和有序性。 可見性: 可見性是一種復雜的屬性,因為可見性中的錯誤總是會違背我們的直覺。通常,我們無法確保執行讀操作的線程能適時地看到其他線程 ...
Java 中 volatile 關鍵字是一個類型修飾符。JDK 1.5 之后,對其語義進行了增強。 保證了不同線程對共享變量進行操作時的可見性,即一個線程修改了共享變量的值,共享變量修改后的值對其他線程立即可見 通過禁止編譯器、CPU 指令重排序和部分 happens-before ...
1.用在多線程同步變量時, 線程為了提高效率,將某成員變量(如A)拷貝了一份(如B),線程中對A的訪問其實訪問的是B。只在某些動作時才進行A和B的同步。因此存在A和B不一致的情況。volatile就是用來避免這種情況的。volatile告訴jvm, 它所修飾的變量不保留拷貝,直接訪問主內存中 ...