设计模式_单例模式
模式:创建型模式
特点:
- 单例只能由一个实例
- 单例必须自己创建自己唯一实例
- 单例类必须给所有其他对象提供这一实例
✨ 例子1_懒汉模式
延迟加载,线程不安全
class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
✨ 例子2_懒汉模式
延迟加载,线程安全
class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
✨ 例子3_饿汉模式
懒汉模式,线程安全
class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
✨ 例子4_双检锁/双重校验锁(DCL,即 double-checked locking)
延迟加载,线程安全
class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) {
synchronized(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
✨ 例子5_登记式/静态内部类
延迟加载,线程安全。因为静态内部类和外部类的静态变量,静态方法一样,只要被调用了都会让外部类的被加载。不过不过当只调用外部类的静态变量,静态方法时,是不会让静态内部类的被加载。
所以我们可以使用这一点达到lazy load
。
class Singleton{
private static class SingletonHolder{
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
✨ 例子6
非延迟加载,线程安全。除此之外,它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
✨ ps
他们总说,你还年轻,可以慢点来。可是为啥我总感觉我已经不够时间了!所以,fight!