1. 程式人生 > >記憶體可見性問題

記憶體可見性問題

當多個執行緒操作共享資料時,彼此不可見是一個問題;

可以使用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;     } }