有些對象其實我們只需要一個,比方說:線程池、緩存、對話框、處理偏好設置和註冊表的對象、日誌對象,充當打印機和顯卡等設備的驅動程序的對象。這些對象只需要一個,如果製造出多個實例,就會導致許多問題產生,比如:程序的行爲異常、資源使用過量,或者是不一致的結果。
設計模式中的單件模式,能夠很好地適應這種需求。以下代碼考慮到了,多線程可能出現的單線程中沒有的問題。給出了幾種常見的解決方案。
/*
* 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以上的版本。