单例设计模式(Singleton Pattern):是指确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。需要注意的是,在系统中只有真正有“单一实例”的需求时才可以使用。
单例使用的三个要点:
(1)某个类只能有一个实例;
(2)该类必须自行创建这个实例;
(3)该类必须自行向整个系统提供这个实例。
下面我会介绍几种常用的单例模式。
1、饿汉式
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
不管用到与否类装载时就完成了实例化,所以如果在程序中没有用到就会浪费内存,但是你不用它那你写它干嘛呢,哈哈哈哈。
2、懒汉式
public class Singleton {
private static Singleton INSTANCE;
private Singleton () {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
线程不安全
3、双重同步锁(懒汉式)
public class Singleton {
// 1. 用volatile关键词是为了防止JVM中执行时指令重排序
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;
}
}
4、Holder式(懒汉式)
public class Singleton {
private Singleton() {}
public statice Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
private class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
}
5、枚举单例
public class Singleton {
INSTANCE;
public static Singleton getInstance() {
return INSTANCE;
}
}