C 多執行緒 volatile關鍵字的原理

2022-03-05 05:03:29 字數 1140 閱讀 2748

2011-05-09  來自:  字型大小:【大中小】

volatile關鍵字

volatile關鍵字僅應用於類或結構字段,用於通知編譯器,將有多個執行緒訪問該欄位,因此它不應當對此成員的狀態做任何優化,這樣可以確保該字段在任何時間呈現的都是最新的值。

不是所有的型別都可以被定義為volatile欄位,只有以下型別才可被定義為volatile:

注意觀察一下,就能發現只有值或引用的位數不超過本機整型值的位數(在32位系統中,為4個位元組)的型別才能成為volatile。為什麼會這樣呢?我的理解是:編譯器之所以保障volatile欄位在多執行緒情況下總是獲取到最新值,最重要的一點是volatile欄位操作的原子性,即編譯後的本地**只用一條機器指令就能對volatile欄位賦值了。如何保證操作的原子性呢?32位系統中,對任何資料操作都是以4位元組為基礎,自然一條機器指定就能搞定執行乙個小於4位元組的賦值操作。但如果字段占用記憶體大於4個位元組,那生成賦值語句的機器指令肯定大於一條,這樣在多執行緒的上下文切換中,有可能剛剛賦值到一半,就被切換到其他執行緒了。這樣,便無法保障volatile欄位在多執行緒環境下總是呈現乙個完整的、合法的最新值了。

volatile關鍵字

volatile關鍵字僅應用於類或結構字段,用於通知編譯器,將有多個執行緒訪問該欄位,因此它不應當對此成員的狀態做任何優化,這樣可以確保該字段在任何時間呈現的都是最新的值。

不是所有的型別都可以被定義為volatile欄位,只有以下型別才可被定義為volatile:

注意觀察一下,就能發現只有值或引用的位數不超過本機整型值的位數(在32位系統中,為4個位元組)的型別才能成為volatile。為什麼會這樣呢?我的理解是:編譯器之所以保障volatile欄位在多執行緒情況下總是獲取到最新值,最重要的一點是volatile欄位操作的原子性,即編譯後的本地**只用一條機器指令就能對volatile欄位賦值了。如何保證操作的原子性呢?32位系統中,對任何資料操作都是以4位元組為基礎,自然一條機器指定就能搞定執行乙個小於4位元組的賦值操作。但如果字段占用記憶體大於4個位元組,那生成賦值語句的機器指令肯定大於一條,這樣在多執行緒的上下文切換中,有可能剛剛賦值到一半,就被切換到其他執行緒了。這樣,便無法保障volatile欄位在多執行緒環境下總是呈現乙個完整的、合法的最新值了。

多執行緒 volatile關鍵字

在多執行緒中,volatile關鍵字是很重要的乙個知識點,在多執行緒共享資源的時候,每個執行緒資料對外都是不可見的,這就容易出現 髒讀 現象,其實就是執行緒私有堆疊中的資料和公共堆疊中的資料不同步造成的.解決這樣的問題,就要使用volatile關鍵字了。那valotitle關鍵字有什麼用,他是強制執...

多執行緒 Volatile 關鍵字

volatile 關鍵字的作用是變數在多個執行緒之間可見,但不保證資料的原子性 package com.jvm.test class threadvolatiledemo extends thread system.out.println 執行緒停止 public void setruning bo...

多執行緒之volatile關鍵字

現代計算機都是馮諾依曼結構的 volatile 變數具備兩種特性,其一是保證該變數對所有執行緒可見,這裡的可見性指的是當乙個執行緒修改了變數的值,那麼新的值對於其他執行緒是可以立即獲取的。其二 volatile 禁止了指令重排。多執行緒的執行可能造成變數資料的不一致 把該變數宣告為volatile ...