常见的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种单例模式的主要内容,如果未能解决你的问题,请参考以下文章

8 种单例模式写法,助你搞定面试!

常见的几种单例模式

常见的几种单例模式

常见的几种单例模式

常见的几种单例模式

单例模式作用特点及常见的单例模式分析(6种单例模式分析)