記憶體可見性問題
當多個執行緒操作共享資料時,彼此不可見是一個問題;
可以使用volatile 關鍵字:當多個執行緒呼叫共享資料時,可以保證記憶體中的資料可見;效率比鎖高;
相較於synchronized 是一種較為輕量級的同步策略;
注意:
1. synchronized具有互斥性,而volatile不具備;互斥性:當一個執行緒作用於一個物件是,另外一個執行緒進不來;執行緒互相排斥;
2. 不能保證變數的"原子性";
當程式執行時,JVM為每個執行緒提供一個獨立的快取提高效率;
JVM底層會對記憶體進行重排序,但是使用volatile關鍵字後,不會進行重排序;效能會有所下降;
public static void main(String[] args) { ThreadDemo demo = new ThreadDemo(); new Thread(demo).start(); while(true){ // synchronized(demo){ if(demo.isFlag()){ System.out.println("-----------"); break; } // } } }
class ThreadDemo implements Runnable{
private volatile boolean flag = false; @Override public void run() { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } flag = true; System.out.println("flag="+isFlag()); }
public boolean isFlag() { return flag; }
public void setFlag(boolean flag) { this.flag = flag; } }