• <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • Java面向對象
    Java異常
    Java數組
    Java常用類
    Java集合
    Java IO流
    Java線程
    Java反射
    Socket編程
    Java注解開發
    Java GoF設計模式
    HashMap
    Java內存模型
    Java線性表

    Java Volatile關鍵字使用場景

     

     

    synchronized關鍵字是防止多個線程同時執行一段代碼,那么就會很影響程序執行效率,而volatile關鍵字在某些情況下性能要優于synchronized,但是要注意volatile關鍵字是無法替代synchronized關鍵字的,因為volatile關鍵字無法保證操作的原子性。通常來說,使用volatile必須具備以下2個條件:

     

    1、對變量的寫操作不依賴于當前值。

     

    2、該變量沒有包含在具有其他變量的不變式中。

     

    實際上,這些條件表明,可以被寫入 volatile 變量的這些有效值獨立于任何程序的狀態,包括變量的當前狀態。

     

    事實上,我的理解就是上面的2個條件需要保證操作是原子性操作,才能保證使用volatile關鍵字的程序在并發時能夠正確執行。

     

    下面列舉幾個Java中使用volatile的幾個場景。

     

    ● 狀態標記量

     

    volatile boolean flag = false;
    while(!flag){
        doSomething();
    }
    public void setFlag() {
        flag = true;
    }
    volatile boolean inited = false;
    //線程1:
    context = loadContext();  
    inited = true;            
    //線程2:
    while(!inited ){
    sleep()
    }
    doSomethingwithconfig(context);

     

    ● double check

     

    class Singleton{
        private volatile static Singleton instance = null;
        private Singleton() {
             
        }
        public static Singleton getInstance() {
            if(instance==null) {
                synchronized (Singleton.class) {
                    if(instance==null)
                        instance = new Singleton();
                }
            }
            return instance;
        }
    }

     

    全部教程
  • <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • 面对面棋牌游戏