一、概念
单例模式,顾名思义,就是保证只有一个实例。
二、示例代码
/**
* 饿汉式,线程安全
*/
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
/**
* 懒汉式,非线程安全,必须加锁
*/
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
/**
* 懒汉式,静态内部类
*/
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {
}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
三、多线程下的单例
通过给线程加锁的方式,保证只有一个线程进入代码块。
/**
* 多线程下的单例(DCL不一定线程安全,因为存在指令重排序,先占位但人稍后到1->3->2,所以需要加入volatile)
* 1.分配对象内存空间
* 2.初始化对象
* 3.设置变量指向的内存地址
*/
public class Singleton {
private static volatile Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
// 双重校验锁 DCL
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}