導航:首頁 > 編程語言 > java中volatile關鍵字的含義

java中volatile關鍵字的含義

發布時間:2023-08-22 23:57:11

『壹』 java 里static 和volatile的區別

變數放在主存區上,使用該變數的每個線程,都將從主存區拷貝一份到自己的工作區上進行操作。

volatile, 聲明這個欄位易變(可能被多個線程使用),Java內存模型負責各個線程的工作區與主存區的該欄位的值保持同步,即一致性。

static, 聲明這個欄位是靜態的(可能被多個實例共享),在主存區上該類的所有實例的該欄位為同一個變數,即唯一性。

volatile, 聲明變數值的一致性;static,聲明變數的唯一性。

此外,volatile同步機制不同於synchronized, 前者是內存同步,後者不僅包含內存同步(一致性),且保證線程互斥(互斥性)。
static 只是聲明變數在主存上的唯一性,不能保證工作區與主存區變數值的一致性;除非變數的值是不可變的,即再加上final的修飾符,否則static聲明的變數,不是線程安全的。

下面摘自Java語言規范(Java Language Specification)的官方解釋:

1) If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created.

2) A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable。

『貳』 java中的關鍵字是是什麼意思

abstract :表明類或類中的方法是抽象的;
assert :聲明斷言;
boolean :基本數據類型之一,布爾類型;
break :提前跳出一個塊;
byte :基本數據類型之一,位元組類型;
case :在switch語句中,表明其中的一個分支
catch :用於處理例外情況,用來捕捉異常;
char :基本數據類型之一,字元類型;
class :類;
continue :回到一個塊的開始處;
default :用在switch語句中,表明一個默認的分支;
do :用在「do while」循環結構中;
double :基本數據類型之一,雙精度浮點數類型;
else :在條件語句中,表明當條件不成立時的分支;
extends :用來表明一個類是另一個類的子類;
final :用來表明一個類不能派生出子類,或類中的方法不能被覆蓋,或聲明一個變數是常量;
finally :用於處理異常情況,用來聲明一個肯定會被執行到的塊;
float :基本數據類型之一,單精度浮點數類型;
for :一種循環結構的引導詞;
if :條件語句的引導詞;
implements :表明一個類實現了給定的介面;
import :表明要訪問指定的類或包;
instanceof :用來測試一個對象是否是一個指定的類的實例;
int :基本數據類型之一,整數類型;
interface :介面;
long :基本數據類型之一,長整數類型;
native :用來聲明一個方法是由與機器相關的語言(如C/C++/FORTRAN語言)實現的;
new :用來申請新的對象;
package :包;
private :一種訪問模式:私有模式;
protected :一種訪問模式:保護模式;
public :一種訪問模式:公共模式;
return :從方法中返回值;
short :基本數據類型之一,短整數類型;
static :表明域或方法是靜態的,即該域或方法是屬於類的;
strictfp :用來聲明FP-strict(雙精度或單精度浮點數)表達式;
算術規范:
super :當前對象的父類對象的引用;
switch :分支結構的引用詞;
synchronized :表明一段代碼的執行需要同步;
this :當前對象的引用;
throw :拋出一個異常;
throws :聲明方法中拋出的所有異常;
thansient :聲明不用序列化的域;
try :嘗試一個可能拋出異常的程序塊;
void :表明方法不返回值;
volatile :表明兩個或多個變數必須同步地發生變法;
while :用在循環結構中;
enum :聲明枚舉類型;
說明:
⑴Java的關鍵字也是隨新的版本發布在不斷變動中的,不是一成不變的。
⑵所有關鍵字都是小寫的。
⑶除這些關鍵字外,Java還定義了一些保留字,也就是說Java保留了它們,但是沒有使用它們,這些詞不 能作為標識符使用。
cast、goto、future、generic、inner、operator、outer、rest、var
⑷true和false不是關鍵字,而是boolean類型直接量。
⑸null也不是關鍵字。
⑹無sizeof運算符;所有類型的長度和表示是固定的,不依賴執行。

『叄』 java單例雙重檢查鎖為什麼需要加volatile關鍵字

已經修改,的確應該加上volatile關鍵字。不加的情況下,假設兩個線程,線專程A正在執行instance = new Instance()的操作,屬而線程B開始執行if(instance==null)的判斷,當不存在volatile的時候,因為 new Instance()是一個非原子操作,可能發生無序寫入,構造函數可能在整個對象構造完成前執行完畢,線程B可能會看到一個不完整的instance對象,因為java的某些實現會在內存中開辟一片存儲對象的區域後直接返回內存的引用,所以線程B判斷不為null,而這時候實際上,instance的構造函數還沒有執行,從而線程b得到不完整的對象。在 Instance 的構造函數執行之前,會在內存中開辟一片存儲對象的區域後直接返回內存的引用,賦值給變數 instance,instance也就可能成為非 null 的,即賦值語句在對象實例化之前調用,此時別的線程得到的是一個還會初始化的對象,這樣會導致系統崩潰線程B可能會看到一個不完整的instance對象,因為java的某些實現,所以線程B判斷不為null。從而得到不完整的對象。

『肆』 java編程,如何徹底理解volatile關鍵字

非java程序員,不過volatile在其他語言中也存在,簡單說下。
1,volatile只在多線程程序中有意義。
2,為了提高性能,編譯器工作時會進行一些優化,如指令排序,甚至跳過一些指令。如:
var
a=1;
a=2;
a=3;
編譯後的結果可能就只執行
a
=
3
3,程序運行時,普通變數會有緩存機制(如cpu緩存、線程本地緩存等),程序讀取時先從緩存讀取,所以多線程的程序運行時可能存在臟讀問題。即第一個線程已經修改了變數值,但第二個線程還在使用緩存中的舊數據。
volatile的作用就是告訴編譯器,不要對使用該變數的代碼進行優化,每次讀寫操作都訪問變數的原始數據。

『伍』 java中對象或者數組用volatile修飾有什麼用

就像大家更熟悉的const一樣,volatile是一個類型修飾符(type specifier)。它是被設計用來修飾被不同線程訪問和修改的變數。如果沒有volatile,基本上會導致這樣的結果:要麼無法編寫多線程程序,要麼編譯器失去大量優化的機會

volatile的作用是: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.

『陸』 誰能真正整明白java volatile 關鍵字

閱讀全文

與java中volatile關鍵字的含義相關的資料

熱點內容
excel是啥類型文件 瀏覽:471
安慶培訓編程怎麼選 瀏覽:817
vs2010mfc工具箱 瀏覽:402
刪除文件重置win10怎麼恢復 瀏覽:180
新裝win10有線連不上 瀏覽:785
資料庫商品名唯一怎麼標注 瀏覽:214
電信5g網路什麼時候出 瀏覽:626
手機如何把視頻打包到文件夾裡面 瀏覽:248
excel數據轉vcf文件 瀏覽:585
編程題如何左右翻轉 瀏覽:920
wp10微信安裝不了 瀏覽:793
微軟資料庫密碼怎麼改 瀏覽:627
我們是貴族什麼app可以看 瀏覽:65
哪個app認字免費 瀏覽:964
少兒編程線上教育如何 瀏覽:137
ps3升級檢測不到優盤升級文件 瀏覽:845
vs連接資料庫顯示數據 瀏覽:867
win10的設備和列印機 瀏覽:876
linux最新 瀏覽:970
蘋果6有時候自動重啟 瀏覽:851

友情鏈接