常见的8种单例模式
Posted Java兵长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见的8种单例模式相关的知识,希望对你有一定的参考价值。
简介:面试常考题之单例模式其实很简单,学过本文之后保证可以迅速且牢固的记住全部的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() {
}
}
优点:装的一手好逼。避免了线程不安全,延迟加载,效率高。 如果面试中出现让你手写代码要去写后三种,最好写双重检查。
以上是关于常见的8种单例模式的主要内容,如果未能解决你的问题,请参考以下文章