1.可見性,保證不同執行緒操作該變數的可見性,即乙個執行緒修改該變數,這個新的值對其他執行緒來說是立刻知道的
2.禁止進行指令重排序(虛擬機器層面,有自己的規則,對**進行排序),有序性
3.volatile只能保證單次讀/寫的原子性。i++這種不能保證
1.volatile定義的值改變,其他執行緒能否檢視(可見性)
public class volatiletestone
//單次讀寫保證原子性
public void addnumber()
public static void volatiletest() catch (interruptedexception e)
}system.out.println("oneover");
});executorservice.execute(()-> catch (interruptedexception e)
}system.out.println("twoover");
});executorservice.shutdown();
while (!executorservice.isterminated())
system.out.println(" "+volatiletestone.n);}}
執行結果
2.進行自增操作,不能確保原子性。
public class volatiletesttwo
public static void volatiletest()
});}
executorservice.shutdown();
while (!executorservice.isterminated())
system.out.println(" "+volatiletesttwo.n);}}
執行結果
多次執行我們會發現還會有其他的結果
不能確保原子性
3.如何解決自增並保證原子性?
public class volatiletestthree
//法(1)進行synchronized加鎖
// public synchronized void addnumber()
//法(2)進行lock加鎖
public void addnumber()finally
}public static void volatiletest()
});}
executorservice.shutdown();
while (!executorservice.isterminated())
system.out.println(" "+volatiletestthree.n);}}
執行結果
加鎖後不管怎麼執行,都會正確。
多執行緒 volatile關鍵字
在多執行緒中,volatile關鍵字是很重要的乙個知識點,在多執行緒共享資源的時候,每個執行緒資料對外都是不可見的,這就容易出現 髒讀 現象,其實就是執行緒私有堆疊中的資料和公共堆疊中的資料不同步造成的.解決這樣的問題,就要使用volatile關鍵字了。那valotitle關鍵字有什麼用,他是強制執...
多執行緒 Volatile 關鍵字
volatile 關鍵字的作用是變數在多個執行緒之間可見,但不保證資料的原子性 package com.jvm.test class threadvolatiledemo extends thread system.out.println 執行緒停止 public void setruning bo...
多執行緒與synchronized關鍵字
在寫這篇文章之前我看過一些關於多執行緒同步的文章,從他們的文章中總結了很多精華,也發現一些不足。很多文章都是從以下四個方面來分析的。1 synchronized修飾乙個非靜態函式,例如synchronized method 2 synchronized修飾乙個靜態函式,例如static synchr...