简介:面试常考题之单例模式其实很简略,学过本文之后保障能够迅速且牢固的记住全副的 8 种单例模式。
8 种单例模式
单例的思维 :
-
只能有一个实例,以公有构造函数,或者外部类模式。
-
提供全局拜访 static
应用场景 :
-
不便资源之间的相互通信。如线程池等。
-
防止因为资源操作时导致的性能或损耗等。如数据库连接池等。
动态常量(饿汉)
public class Singleton {private final static Singleton SINGLETON = new Singleton();
private Singleton(){}
public static Singleton getInstance(){return SINGLETON;}
}
长处:书写简略,并且防止了线程同步问题。毛病:在类装载的时候就实现实例化。如果从始至终从未应用过这个实例,则会造成内存的节约。
动态代码块(饿汉)
public class Singleton {
private static Singleton singleton;
static {singleton = new Singleton();
}
private Singleton() {}
public Singleton getInstance() {return singleton;}
}
优缺点同上。
非线程平安(懒汉)
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {if (singleton == null) {singleton = new Singleton();
}
return singleton;
}
}
长处:达到懒加载,防止内存节约。毛病:线程不平安。
线程平安同步代码块(懒汉)
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static synchronized Singleton getInstance() {if (singleton == null) {singleton = new Singleton();
}
return singleton;
}
}
长处:达到懒加载,防止内存节约。毛病:线程并不齐全平安,加载效率低。
线程平安同步办法(懒汉)
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {singleton = new Singleton();
}
}
return singleton;
}
}
长处:达到懒加载,防止内存节约。毛病:线程并不齐全平安。
双重查看(举荐应用)
public class Singleton {
// 思考此处为什么用 volatile?答:禁止指令重拍
// 为什么要禁止指令重拍?答:此处设计到 jvm 类加载机制。加载 链接 初始化。// 链接中验证 筹备 解析,在筹备的过程中就开拓了内存,然而真正执行类中定义的 java 程序代码切实初始化阶段,// 初始化实现了对象才不为空。如果指令错乱在多线程的时候就容易呈现多创建对象状况。private static volatile Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();
}
}
}
return singleton;
}
}
长处:线程平安,提早加载,效率较高。
外部类(举荐应用)
public class Singleton {
private Singleton() {}
private static class SingletonInstance {private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {return SingletonInstance.INSTANCE;}
}
长处:防止了线程不平安,提早加载,效率高。
枚举(举荐应用)
public enum Singleton {
INSTANCE;
public void xxx() {}
}
长处: 装的一手好逼 。防止了线程不平安,提早加载,效率高。如果面试中呈现让你手写代码要去写后三种,最好写双重查看。