一. 單件模式:保證一個類僅有一個實例,並提供一個全局訪問點。
二. 實例
懶漢式:
雙重檢查加鎖:減少使用同步,一個私有構造器,一個靜態方法,一個靜態變量。
public class Singleton { private volatile static Singleton uniqueInstance; //volatile提示JVM這個成員變量不能保存它的私有拷貝,而應直接與共享成員變量交互。 private Singleton() { }//把構造器聲明爲私有的,只有在本類內才能調用構造器。 public static Singleton getInstance() { //需定義成靜態方法 if (uniqueInstance == null) { //防止每次進行判斷之前都要經過lock鎖定,耗時。 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } public String getDescription() { return "I'm a thread safe Singleton!"; } }
餓漢式:不管用不用,一開始就建立這個單例對象。
public class Singleton{ private static Singleton uniqueInstance = new Singleton(); //建立對象 private Singleton(){ } public static Singleton getInstance(){ return uniqueInstance ;//直接返回單例對象 } }
測試類:
public class SingletonClient { public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); System.out.println(singleton.getDescription()); } }
三. 應用場景
1. 單例模式應用的場景一般發現在以下條件下:
(1)資源共享的情況下,避免資源操作時導致的性能或損耗等。如日誌文件,應用配置。
(2)控制資源的情況下,方便資源之間的互相通信。如線程池等。
2. 常見應用:
任務管理器,回收站,網站的計數器,數據庫連接池,多線程的線程池,應用程序的日誌應用, Web應用的配置對象的讀取 等。