設計模式中單件模式的學習記錄-java

有些對象其實我們只需要一個,比方說:線程池、緩存、對話框、處理偏好設置和註冊表的對象、日誌對象,充當打印機和顯卡等設備的驅動程序的對象。這些對象只需要一個,如果製造出多個實例,就會導致許多問題產生,比如:程序的行爲異常、資源使用過量,或者是不一致的結果。

設計模式中的單件模式,能夠很好地適應這種需求。以下代碼考慮到了,多線程可能出現的單線程中沒有的問題。給出了幾種常見的解決方案。

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication6;

import java.util.ArrayList;

/**
 *多線程同樣能保證單實例對象。
 * @author Admin
 */
public class Singleton {
    //處理對線程2.在JVM加載類時,馬上創建唯一的單件實例。
    //private static Singleton uniqueInstance=new Singleton();//其他地方採用普通做法
    private volatile static Singleton uniqueInstance;//普通做法的沒有volatile
    private ArrayList arr=new ArrayList();
    private void Singleton(){}
    public static  Singleton getInstance(){//處理多線程1.static後面添加synchronized,同步該方法。
        if(uniqueInstance==null){//普通做法的沒有這句
            synchronized (Singleton.class){//普通做法的沒有這句
                if(uniqueInstance==null){
                    uniqueInstance=new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
    public void setItem(String item){
        arr.add(item);
    }
    public void print(){
        for(int i=0;i<arr.size();i++){
            System.out.println(arr.get(i));
        }
    }
}

多線程幾種解決方案綜述:

(1)把生產單例對象的方法設置成同步方法。

(2)在JVM加載類時,馬上創建一個單例實例對象,即不適用實例化的方法。

(3)使用雙重檢查加鎖,首先檢查是否實例已經創建了,若果尚未創建,“才”進行同步。這樣,只有第一次會同步,這個方法是最好的。但是有一個顯示,必須使用java5以上的版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章