Volatile關鍵字詳解

Volatile關鍵字java

首先了解Voiatile關鍵字,須要瞭解線程的三大特性緩存


1. 原子性: 要麼成功,要麼失敗ide

2. 可見性: 多個線程同時訪問一個變量時,一個線程修改了這個變量值,其餘線程立馬能夠看到性能

3. 有序性: 程序的執行順序按如今的順序spa


瞭解了線程3打特性,咱們就能夠深刻了解Volatile關鍵字了線程


1.什麼是Volatile排序


Volatile是java虛擬機提供的輕量級同步機制內存


保證了可見性ci

禁止指令重排序同步

不能保證原子性

2. 可見性詳解


可見性是說一旦某個線程修改了被Volatile修飾的變量,他會保證修改的值立馬被更新到主內存,其餘線程訪問時能夠當即獲取修改的值,以下代碼


public volatile Integer a = 1;


在java中爲了加快程序運行效率,對於一些變量操做,常量,是在線程寄存器 或是 CPU緩存進行的,之久纔會同步主內存,而加了Volatile後直接讀寫主內存


Volatile保證了了變量可見性,可是不能保證原子性

.

3. 原子性詳解


要麼成功,要麼失敗 爲何Volatile 不能保證原子性


public volatile int a = 1;

   

   public  void add(){

       a++;

   }


若是有多條線程同時調用add方法


1.從主內存 獲取 數據

2.進行+1操做

3.寫回主內存

若是同時調用都會讀取到 好比 0 都會同時 +1 ,循環100次 ,可能會致使打印出來結果小於 100


4. 禁止指令重排序


指令重排序是指cpu採用了容許多條指令不安程序規定順序分開給各個電路單元處理


所以,加上Volatile 關鍵字後能夠防止進行排序


5. 性能


Volatile 讀性能和普通變量差很少,但寫操做慢,他須要在本地代碼插入許多內存屏障指令,不發生亂序

相關文章
相關標籤/搜索