- 餓漢模式:也就是一開始就創建該對象。
- 懶漢模式:等到需要用到的時候才創建該對象。
public class Singleton {
private static Singleton singleton;
private Singleton(){};
/**
*
* getInstance:返回單例. <br/>
*
* @author whc
* @return
* @since JDK 1.8
*/
public static Singleton getInstance(){
if(singleton == null)
singleton = new Singleton();
return singleton;
}
}
餓漢模式:
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){};
/**
*
* getInstance:返回單例. <br/>
*
* @author whc
* @return
* @since JDK 1.8
*/
public static Singleton getInstance(){
return singleton;
}
}
public static synchronized Singleton getInstance(){
if(singleton == null)
singleton = new Singleton();
return singleton;
}
此時確實能解決問題,但是效率不高,比如說,無論這個對象存不存在,那麼都需要加鎖解鎖,但是道理上應該是創建完後就不需要加鎖了。所以有以下改進2。
改進2:
public class Singleton {
private static Singleton singleton;
private static Lock lock = new ReentrantLock();
private Singleton(){};
/**
*
* getInstance:返回單例. <br/>
*
* @author whc
* @return
* @since JDK 1.8
*/
public static Singleton getInstance(){
if(singleton == null){
lock.lock();
try {
if(singleton == null){
singleton = new Singleton();
}
} finally{
lock.unlock();
}
}
return singleton;
}
}
- 基本概念:分餓漢,懶漢模式。實現:只提供私有構造函數 與 getInstance 方法。
- 普通的單例模式的實現不支持多線程環境,若需支持則要結合 synchronized 或者 lock 等多線程處理方式。
參考:
1. 《劍指 Offer》。