volatile, synchronize關鍵字實現原理
Java程式碼在編譯後會變成Java位元組碼, 位元組碼被ClassLoader
載入到JVM中, JVM執行位元組碼, 最終要轉化為彙編指令在CPU上執行,
Java中所使用的併發機制依賴於JVM的實現和CPU的指令.
volatile原語
volatile
是輕量級的synchronized
, 它在多CPU(注意不僅僅是多核)開發中保證了共享變數的可見性.
由於volatile
只保證了可見性, 無法保證原子性, 所以比synchronized
的執行成本更低, 它不會引起上下文的切換和排程.
volatile實現原理
為加快CPU的處理速度, 它是不直接與記憶體進行通訊, 而是先將系統記憶體的資料讀到CPU內部快取(L1, L2或其他)後再進行操作,
但操作完全不知道何時會寫回記憶體
被volatile
標註的變數如果被修改了, 會引起一系列的變化:
- 當前操作的的CPU會強制將快取行中的變化立即寫回到記憶體中;
- 這個寫回記憶體的操作會使在其他CPU裡快取了該記憶體地址的資料立即失效, 也就是其他CPU如果需要再使用這個變數,
需要重新到記憶體中讀取到CPU快取中;
synchronized原語實現原理與應用
Java中的每一個物件都可以作為鎖
JavaSE 1.6中, 鎖一共有四種狀態, 級別從低到高依次為: 無鎖狀態, 偏向鎖, 輕量級鎖, 重量級鎖. 當低階的鎖機制不適配的時候, 程式會自動將鎖升級為高級別的鎖.
偏向鎖
偏向鎖使用了一種等到競爭出現才釋放鎖
輕量級鎖
在競爭鎖的時候, 不會阻塞, 而是使用’自旋’機制反覆嘗試獲取鎖(始終消耗CPU時間片), 直到獲取鎖.
重量級鎖
就是JavaSE 1.6之前的鎖機制
鎖的優缺點對比
類別 | 優點 | 缺點 | 適用場景 |
---|---|---|---|
偏向鎖 | 和執行非同步的方法相比僅存在納秒級的差距 | 如果執行緒間存在鎖競爭, 則會帶來額外的鎖撤銷的消耗 | 適用於長期只有一個執行緒訪問同步塊的場景 |
輕量級鎖 | 競爭鎖的執行緒不會阻塞, 提高了程式的響應速度 | 競爭的執行緒會自旋, 消耗CPU | 追求響應時間, 且同步塊執行速度非常快的場景 |
重量級鎖 | 競爭鎖的執行緒不自旋, 不會消耗CPU | 競爭鎖的執行緒會阻塞, 相應時間緩慢 | 追求吞吐量, 或者是同步塊執行時間較長的時候 |
原子操作的實現原理
原子操作的定義是:
不可被中斷的一個或者一系列操作
CPU如何實現原子操作
匯流排鎖
使用處理器提供的一個LOCK#訊號, 當一個處理器在總線上輸出此訊號時, 其他處理器的請求將被阻塞, 那麼該處理器可以獨佔共享記憶體.
快取鎖
同一時刻, 我們只需要保證對某個記憶體地址的操作是原子性的即可
Java如何實現原子操作
Java中可以通過鎖和迴圈CAS(Compare and Set)的方式來實現原子操作, 具體的表現形式是內建了一些類來支援原子操作: 如AtomicBoolean
,
AtomicInteger
, AtomicLong
等
CAS實現原子操作的問題
迴圈開銷大:
自旋CAS如果長時間不成功, 會給CPU帶來非常大的執行開銷
只能保證一個共享變數的原子操作
如果一個類有兩個以上的field時, 就需要使用鎖了.
使用鎖機制來實現原子操作
實際上執行緒操作鎖的方式在底層也是使用迴圈CAS的方式來進行鎖的獲取和釋放的.
相關推薦
volatile, synchronize關鍵字實現原理
Java程式碼在編譯後會變成Java位元組碼, 位元組碼被ClassLoader載入到JVM中, JVM執行位元組碼, 最終要轉化為彙編指令在CPU上執行, Java中所使用的併發機制依賴於JVM的實現和CPU的指令. volatile原語 volat
就是要你懂Java中volatile關鍵字實現原理
stub string home 技術分享 訪問速度 get 地址傳遞 code 緩沖 原文地址http://www.cnblogs.com/xrq730/p/7048693.html,轉載請註明出處,謝謝 前言 我們知道volatile關鍵字的作用是保證變量在多線程之
Java中volatile關鍵字實現原理
三級 poll 解讀 內存屏障 就會 主存 發生 調用 獲得 原文地址http://www.cnblogs.com/xrq730/p/7048693.html,轉載請註明出處,謝謝 前言 我們知道volatile關鍵字的作用是保證變量在多線程之間的可見性,它是ja
volatile的底層實現原理
CPU的術語定義 volatile是輕量級的synchronized,比之執行成本更低,因為它不會引起執行緒的上下文切換,它在多處理器開發中保證了共享變數的“可見性”,“可見性”的意思是當一個執行緒修改一個變數時,另外一個執行緒能讀到這個修改的值。
volatile與synchronized實現原理
------------------------------------------------------------------ 剛開始認識volatile的時候,覺得對它的一些特性非常迷惑。比如:具有可見性,如果一個執行緒修改了volatile變數的值,那麼其它執行緒也會發現這一點;同時它又不
Java併發程式設計的藝術——volatile和synchronized實現原理
volatile volatile變數修飾的共享變數進行寫操作時候,會多出lock字首指令。 lock字首指令在多核處理器下會引發一下兩件事情: 將當前處理器快取行的資料寫回到系統記憶體。 這個寫回記
synchronize的實現原理(偏向鎖)
1 介紹 當一個執行緒試圖訪問同步的程式碼時,會首先嚐試獲取鎖。執行完畢或者丟擲異常的時候會主動釋放鎖。否則會一直阻塞著。 1.1 實現原理 從JVM規範中可以看到synchronize的實現主要是基於monitor物件來實現的。monitorenter是
synchronize的實現原理
鎖的資料結構 同步程式碼塊是使用monitorenter和monitorexit指令實現的,任何java物件都有一個monitor與之關聯,當一個monitor被持有後,物件就處於鎖定狀態。 在執行期間,Mard Word裡儲存的資料會隨著鎖標誌位的
深入理解Volatile關鍵字及其實現原理
volatile的用法 volatile通常被比喻成"輕量級的synchronized",也是Java併發程式設計中比較重要的一個關鍵字。和synchronized不同,volatile是一個變數修飾符,只能用來修飾變數。無法修飾方法及程式碼塊等。 volatile的用法比較簡單,只需要在
深入分析Volatile的實現原理
queue 鏈接地址 什麽 高速緩存 spa 其中 帶來 系統內存 單詞 引言 在多線程並發編程中synchronized和Volatile都扮演著重要的角色,Volatile是輕量級的synchronized,它在多處理器開發中保證了共享變量的“可見性”。可見性的意思是當
volatile 實現原理
volatile實現原理volatile變量自身具有下列特性:可見性。對一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最後的寫入。原子性:對任意單個volatile變量的讀/寫具有原子性,但類似於volatile++這種復合操作不具有原子性。其實現原理為: 1,通過插入內
JAVA多線程之Synchronize 關鍵字原理
exc 成功 width origin www word 存在 方案 嘗試 image 眾所周知 Synchronize 關鍵字是解決並發問題常用解決方案,有以下三種使用方式: 同步普通方法,鎖的是當前對象。 同步靜態方法,鎖的是當前 Class 對象。 同步塊,鎖
Java併發(四):volatile的實現原理 Java併發(一):Java記憶體模型乾貨總結
synchronized是一個重量級的鎖,volatile通常被比喻成輕量級的synchronized volatile是一個變數修飾符,只能用來修飾變數。 volatile寫:當寫一個volatile變數時,JMM會把該執行緒對應的本地記憶體中的共享變數重新整理到主記憶體。 volatile讀:當讀一
Java並發(四):volatile的實現原理
ont style tile 讀寫 flush microsoft div 圖片 println synchronized是一個重量級的鎖,volatile通常被比喻成輕量級的synchronized volatile是一個變量修飾符,只能用來修飾變量。 volatile寫
Java併發(七):雙重檢驗鎖定DCL Java併發(六):volatile的實現原理
雙重檢查鎖定(Double Check Lock,DCL) 1、懶漢式單例模式,無法保證執行緒安全: public class Singleton { private static Singleton singleton; private Singleton
【面試寶典 - 基礎篇 - Java 鎖機制】02 volatile 實現原理
在 JVM 底層 volatile 是採用 “記憶體屏障” 來實現的 快取一致性協議(MESI 協議)它確保每個快取中使用的共享變數的副本是一致的。其核心思想如下:當某個 CPU 在寫資料時,如果發現操作的變數時共享變數,則會通知其他 CPU 告知該變數的快取行是無效的,因為其
Java併發(十九):final實現原理 淺談Java中的final關鍵字
final在Java中是一個保留的關鍵字,可以宣告成員變數、方法、類以及本地變數。 一旦你將引用宣告作final,你將不能改變這個引用了,編譯器會檢查程式碼,如果你試圖將變數再次初始化的話,編譯器會報編譯錯誤。 一、final變數 final成員變量表示常量,只能被賦值一次,賦值後值不再改變(fin
java併發機制的底層實現原理(一):volatile深入分析
java程式碼最終會被類載入器載入到JVM中,然後轉化為彙編指令在CPU上執行。java中所使用的併發機制依賴於JVM的實現和CPU的指令。 1.volatile的應用 volatile是一個輕量級的synchronize,它保證了共享變數的可見性,確保了所有執
Java併發(四):volatile的實現原理
synchronized是一個重量級的鎖,volatile通常被比喻成輕量級的synchronized volatile是一個變數修飾符,只能用來修飾變數。 volatile寫:當寫一個volatile變數時,JMM會把該執行緒對應的本地記憶體中的共享變數重新整理到主記憶體。 volatile讀:當讀一個vo
volatile的實現原理與應用
Java程式碼在編譯後會變成Java位元組碼,位元組碼被類載入器載入到JVM裡,JVM執行位元組碼,最終需要轉化為彙編指令在CPU上執行,Java中所使用的併發機制依賴於JVM的實現和CPU的指令。 volatile的應用 在多執行緒併發程式設計中synchronized和volatile都扮演著重要的角