簡單了解java volatile關鍵字實現的原理
一、volatile關鍵字的語義分析
1.保證可見性
對共享變量的修改,其他線程能夠馬上感知到。但不能保證原子性(i++)
2.保證有序性
3.volatile的原理和實現機制
有volatile修飾的共享變量進行寫操作的時候會多出有 “l(fā)ock”標志的匯編代碼,Lock前綴的指令在多核處理器下會引發(fā)兩件事情:
1)將當前處理器緩存行中的數據寫回到系統(tǒng)內存中
2)這個寫回內存的操作會使在其他cpu里緩存了該內存地址的數據無效。
二、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;
}
}
當調用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.對可見性的保證
兩者都能保證可見性,但實現原理不同
volatile對變量添加了lock,synchronized使用monitorenter和monitorexit。
4.對有序性的保證
volatile能保證有序,synchronized也能保證有序,但是代價大
5.其他
synchronized會引起阻塞,volatile不會引起阻塞。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Java并發(fā)編程volatile關鍵字的作用
- Java多線程并發(fā)編程 Volatile關鍵字
- Java并發(fā)編程:volatile關鍵字詳細解析
- 詳細分析java并發(fā)之volatile關鍵字
- 深入了解Java中Volatile關鍵字
- Java Volatile關鍵字同步機制詳解
- Java Volatile關鍵字實現原理過程解析
- 一文精通Java中的volatile關鍵字
- Java面試官最喜歡問的關鍵字之volatile詳解
- Java中的關鍵字volatile詳解
- 詳解Java面試官最愛問的volatile關鍵字
- Java中Volatile關鍵字詳解及代碼示例
- Java并發(fā)編程——volatile關鍵字
相關文章
mybatis中BigDecimal中的0存為null的坑及解決
在使用MyBatis進行數據庫操作時,若Java中屬性類型為BigDecimal且值為0,插入數據庫時可能會變?yōu)閚ull,而不是0,這個問題可能是由于MyBatis在處理BigDecimal類型時的弱類型判斷導致的,當BigDecimal變量與空字符串進行比較時,MyBatis可能將其視為null2024-10-10

