簡單了解java volatile關鍵字實現(xiàn)的原理
一、volatile關鍵字的語義分析
1.保證可見性
對共享變量的修改,其他線程能夠馬上感知到。但不能保證原子性(i++)
2.保證有序性
3.volatile的原理和實現(xiàn)機制
有volatile修飾的共享變量進行寫操作的時候會多出有 “l(fā)ock”標志的匯編代碼,Lock前綴的指令在多核處理器下會引發(fā)兩件事情:
1)將當前處理器緩存行中的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存中
2)這個寫回內(nèi)存的操作會使在其他cpu里緩存了該內(nèi)存地址的數(shù)據(jù)無效。
二、volatile的使用場景
1.狀態(tài)標志(開關模式)
package com.roy.http;
public class ShutDownDemmo extends Thread{
private volatile boolean state = false;
@Override
public void run() {
while(state){
System.out.println("我在做工作");
}
}
public void shutDown(){
state = false;
}
}
當調(diào)用shutDown方法時,里面只有一個賦值操作,所以它是原子性的,同時state字段是volatile的,所以當值發(fā)生變化時其它線程會立即察覺到。
2.雙重檢查鎖定(double-checked-locking)
package com.roy.http;
public class Singleton {
private volatile static Singleton instance;
public static Singleton getInstance(){
if (instance==null) {
synchronized (Singleton.class) {
instance = new Singleton();
}
}
return instance;
}
}
單例模式中使用雙重檢查鎖定。
三、volatile和synchronized的區(qū)別
1.使用上的區(qū)別
volatile只能修飾變量,而synchronized只能修飾方法和語句塊。
2.對原子性的保證
volatile不能保證原子性,synchronized保證了原子性。
3.對可見性的保證
兩者都能保證可見性,但實現(xiàn)原理不同
volatile對變量添加了lock,synchronized使用monitorenter和monitorexit。
4.對有序性的保證
volatile能保證有序,synchronized也能保證有序,但是代價大
5.其他
synchronized會引起阻塞,volatile不會引起阻塞。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Java并發(fā)編程volatile關鍵字的作用
- Java多線程并發(fā)編程 Volatile關鍵字
- Java并發(fā)編程:volatile關鍵字詳細解析
- 詳細分析java并發(fā)之volatile關鍵字
- 深入了解Java中Volatile關鍵字
- Java Volatile關鍵字同步機制詳解
- Java Volatile關鍵字實現(xiàn)原理過程解析
- 一文精通Java中的volatile關鍵字
- Java面試官最喜歡問的關鍵字之volatile詳解
- Java中的關鍵字volatile詳解
- 詳解Java面試官最愛問的volatile關鍵字
- Java中Volatile關鍵字詳解及代碼示例
- Java并發(fā)編程——volatile關鍵字
相關文章
mybatis中BigDecimal中的0存為null的坑及解決
在使用MyBatis進行數(shù)據(jù)庫操作時,若Java中屬性類型為BigDecimal且值為0,插入數(shù)據(jù)庫時可能會變?yōu)閚ull,而不是0,這個問題可能是由于MyBatis在處理BigDecimal類型時的弱類型判斷導致的,當BigDecimal變量與空字符串進行比較時,MyBatis可能將其視為null2024-10-10
springboot?jpa?實現(xiàn)返回結果自定義查詢
這篇文章主要介紹了springboot?jpa?實現(xiàn)返回結果自定義查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot整合Quartz實現(xiàn)定時任務詳解
這篇文章主要介紹了Java?任務調(diào)度框架?Quartz,Quartz是OpenSymphony開源組織在Job?scheduling領域又一個開源項目,完全由Java開發(fā),可以用來執(zhí)行定時任務,類似于java.util.Timer。,下面我們來學習一下關于?Quartz更多的詳細內(nèi)容,需要的朋友可以參考一下2022-08-08

