定义:
单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”
类图:
实现:
饿汉模式(立即加载):
特点:
使用前会占据一定的内存,但第一次的调用很快。
利用静态成员变量:
public class Singleton {
private static Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;//此版本代码的缺点是不能有其他实例变量。
}
}
利用静态代码块(和上一个类似):
public class Singleton {
private static Singleton instance;
static {
instance=new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
懒汉模式(延迟加载):
多线程下失败的实现:
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){//竞争条件
instance=new Singleton();
}
return instance;
}
}
利用Synchronized改进(效率低下):
1.同步方法
public class Singleton {
private static Singleton instance;
private Singleton(){}
public synchronized static Singleton getInstance(){
if(instance==null){
//做一些准备工作,全部代码都上了锁效率很低下。
instance=new Singleton();
}
return instance;
}
}
2.同步代码块
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
synchronized(Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
return instance;
}
}
3.失败改进
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){//非线程安全
synchronized(Singleton.class){
instance=new Singleton();
}
}
return instance;
}
}
DCL双锁检查机制:
public class Singleton {
private static volatile Singleton instance;//保证内存可见性以及禁止指令重排序。
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
//做一些准备工作
synchronized(Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
静态内部类:
public class Singleton {
private Singleton(){}
private static class SingletonHandler{
private static final Singleton instance=new Singleton();
}
public static Singleton getInstance(){
return SingletonHandler.instance;
}
}