1. 程式人生 > >volatile, synchronize關鍵字實現原理

volatile, synchronize關鍵字實現原理

Java程式碼在編譯後會變成Java位元組碼, 位元組碼被ClassLoader載入到JVM中, JVM執行位元組碼, 最終要轉化為彙編指令在CPU上執行,
Java中所使用的併發機制依賴於JVM的實現和CPU的指令.

volatile原語

volatile是輕量級的synchronized, 它在多CPU(注意不僅僅是多核)開發中保證了共享變數的可見性.

由於volatile只保證了可見性, 無法保證原子性, 所以比synchronized的執行成本更低, 它不會引起上下文的切換和排程.

volatile實現原理

為加快CPU的處理速度, 它是不直接與記憶體進行通訊, 而是先將系統記憶體的資料讀到CPU內部快取(L1, L2或其他)後再進行操作,
操作完全不知道何時會寫回記憶體

.

volatile標註的變數如果被修改了, 會引起一系列的變化:

  1. 當前操作的的CPU會強制將快取行中的變化立即寫回到記憶體中;
  2. 這個寫回記憶體的操作會使在其他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都扮演著重要的角