单例设计模式是java最为常用的一种模式,顾名思义:通过单例模式可以保证系统中一个类只有一个实例。一下主要介绍几种常见的单例设计模式。
懒汉式非线程安全:
public class Singleton{
private Singleton(){};
private static Singleton singleton = null;
public static Singleton getSingleton() {
if (singleton == null) {
singleton = new Singleton();//用到时,才初始化。
}
return singleton;
}
}
懒汉式线程安全
public class Singleton{
private Singleton(){};
private static Singleton singleton = null;
public static synchronized Singleton getSingleton() {
if (singleton == null) {
singleton = new Singleton();//用到时,才初始化。
}
return singleton;
}
}
饿汉式:
public class Singleton {
private static final Singleton instance = new Singleton(); //不管用不用,都初始化。
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
双重校验锁:
public class Singleton {
private volatile static Singleton instance; //声明成 volatile
private Singleton (){}
public static Singleton getSingleton() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
静态内部类 static nested class:
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本身机制保证了线程安全问题;由于 SingletonHolder 是私有的,除了 getInstance() 之外没有办法访问它,因此它是懒汉式的;同时读取实例的时候不会进行同步,没有性能缺陷;也不依赖 JDK 版本。