1. 程式人生 > >[23]單例模式懶漢式併發安全問題

[23]單例模式懶漢式併發安全問題

 一、餓漢式

/*餓漢式*/
class SingleTon{
    private SingleTon single=new Single();
    public SingleTon getInstance(){
        return s;
    }
}

 餓漢式的是共同物件,但是因為沒有多次運算。所以不會多執行緒時,不會產生資料出錯。

二、懶漢式

class SingleTon{
    private SingleTon single=null;
    public SingleTon getInstance(){
        if(single==null){
            single=new SingleTon();
        }
        return s;
    }
}

懶漢式的是共同物件,但是有多次運算,在多執行緒時,會產生資料出錯。所以要用同步。

class SingleTon{
    private SingleTon single=null;
    public synchronized SingleTon getInstance(){
        if(single==null){
            single=new SingleTon();
        }
        return single;
    }
}

可以解決問題,但是因為synchronized修飾方法的話,每次需要獲取物件,都要爭奪鎖。導致資源浪費,效能降低。

那麼加一句判斷即可。

class SingleTon{
    private SingleTon single=null;
    public SingleTon getInstance(){
        /*這個if無論有沒有加上同步,都要進行判斷的。*/
        if(single==null){
        /*如果null那麼就建立例項。之後接下來的只要判斷是不是null,只要不是統統就不用再進入同步鎖*/
            synchronized(single){
                if(single==null){
                    single=new Single();
                }
            }  
        }
        return single;
    }
}

雖說提高效能。但是繁瑣,容易出錯。實際開發中,使用餓漢式。因為只要用到了單例,都要建立物件。那麼直接使用餓漢式,不僅不會出現問題,而且程式碼相對於簡化。