單線程版單例模式實(shí)現(xiàn)
/**
* 單線程下的單例模式實(shí)現(xiàn)
*/
public class SingleThreadSingleton {
// 保存該類的唯一實(shí)例
private static SingleThreadSingleton instance = null;
/**
* 私有構(gòu)造方法
*/
private SingleThreadSingleton() {
}
public static SingleThreadSingleton getInstance() {
if(null == instance) { // 操作1
instance = new SingleThreadSingleton(); // 操作2
}
return instance;
}
}
這個(gè)代碼在多線程情況下码俩,getInstance()中的if操作不是一個(gè)原子操作上遥,可能會(huì)導(dǎo)致多個(gè)實(shí)例的創(chuàng)建近速。
簡單加鎖版單例模式實(shí)現(xiàn)
public class SimpleMultipleThreadSingleton {
// 保存該類的唯一實(shí)例
private static SimpleMultipleThreadSingleton instance = null;
/**
* 私有構(gòu)造方法
*/
private SimpleMultipleThreadSingleton() {
}
public static SimpleMultipleThreadSingleton getInstance() {
synchronized(SimpleMultipleThreadSingleton.class) { // 加鎖
if(null == instance) {
instance = new SimpleMultipleThreadSingleton();
}
}
return instance;
}
}
雖然是線程安全的低缩,但是每次在調(diào)用getInstance()方法時(shí)都會(huì)去申請(qǐng)鎖和釋放鎖,產(chǎn)生了資源開銷涩禀。
基于雙重檢查鎖定的單例模式 (不再提倡使用)
錯(cuò)誤實(shí)現(xiàn)
public class IncrrentDCLSingleton {
// 保存該類的唯一實(shí)例
private static IncrrentDCLSingleton instance = null;
/**
* 私有構(gòu)造方法
*/
private IncrrentDCLSingleton() {
}
public static IncrrentDCLSingleton getInstance() {
if(null == instance) { // 操作1
synchronized(IncrrentDCLSingleton.class) {
if(null == instance) { // 操作2
instance = new IncrrentDCLSingleton(); // 操作3
}
}
}
return instance;
}
}
重排序可能會(huì)導(dǎo)致錯(cuò)誤
解決方法:給instance變量添加volatile修飾符即可
正確實(shí)現(xiàn)
public class DCLSingleton {
// 保存該類的唯一實(shí)例
private static volatile DCLSingleton instance = null;
/**
* 私有構(gòu)造方法
*/
private DCLSingleton() {
}
public static DCLSingleton getInstance() {
if(null == instance) { // 操作1
synchronized(DCLSingleton.class) {
if(null == instance) { // 操作2
instance = new DCLSingleton(); // 操作3
}
}
}
return instance;
}
}
基于靜態(tài)內(nèi)部類的單例模式實(shí)現(xiàn)
public class StaticHolderSingleton {
// 保存該類的唯一實(shí)例
private static volatile StaticHolderSingleton instance = null;
/**
* 私有構(gòu)造方法
*/
private StaticHolderSingleton() {
}
private static class StaticHolderSingletonHolder {
// 保存StaticHolderSingleton的唯一實(shí)例
final static StaticHolderSingleton INSTANCE = new StaticHolderSingleton();
}
public static StaticHolderSingleton getInstance() {
return StaticHolderSingletonHolder.INSTANCE;
}
}
基于枚舉的單例模式實(shí)現(xiàn)
public enum Singleton {
INSTANCE;
Singleton() {
}
}