单例模式
创建方式
饿汉方式:指全局的单例实例在类装载时构建懒汉方式:指全局的单例实例在第一次被使用时构建
不管是那种创建方式,它们通常都存在下面几点相似处:
单例类必须要有一个 private 访问级别的构造函数,只有这样,才能确保单例不会在系统中的其他代码内被实例化;instance 成员变量和 uniqueInstance 方法必须是 static 的。
饿汉模式(线程安全)
public class Singleton {
private static Singleton uniqueInstance
= new Singleton();
private Singleton(){}
public static Singleton
getInstance(){
return uniqueInstance
;
}
}
懒汉模式
线程不安全
public class Singleton {
private static Singleton uniqueInstance
;
private Singleton
() {}
public static Singleton
getInstance() {
if (uniqueInstance
== null
) {
uniqueInstance
= new Singleton();
}
return uniqueInstance
;
}
}
线程安全
给getInstance方法加上syncronized
public class Singleton {
private static Singleton uniqueInstance
;
private Singleton
(){
}
public static synchronized Singleton
getInstance() {
if (instance
== null
) {
uniqueInstance
= new Singleton();
}
return uniqueInstance
;
}
}
双重校验锁版本
实例变量为volatile
public class Singleton {
private volatile static Singleton uniqueInstance
;
private Singleton() {
}
public static Singleton
getInstance() {
if (uniqueInstance
== null
) {
synchronized(Singleton
.class) {
if (uniqueInstance
== null
) {
uniqueInstance
= new Singleton();
}
}
}
return uniqueInstance
;
}
}
懒汉式(登记式/静态内部类方式)
只有通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance(只有第一次使用这个单例的实例的时候才加载,同时不会有线程安全问题)。
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE
= new Singleton();
}
private Singleton
(){}
public static final Singleton
getInstance() {
return SingletonHolder
.INSTANCE
;
}
}
饿汉式(枚举方式)
使用枚举来实现单实例控制会更加简洁,而且无偿地提供了序列化机制,并由JVM从根本上提供保障,绝对防止多次实例化,是更简洁、高效、安全的实现单例的方式。
public enum Singleton
{
INSTANCE
;
public void doSomeThing() {
System
.out
.println("枚举方法实现单例");
}
}
public class ESTest {
public static void main(String
[] args
) {
Singleton singleton
= Singleton
.INSTANCE
;
singleton
.doSomeThing();
}
}