首页 > 编程语言 > 详细

java实现单例模式的各种写法

时间:2021-05-05 11:46:34      阅读:26      评论:0      收藏:0      [点我收藏+]

饿汉式

public class SingletonObject1 {

  private SingletonObject1() {
  }

  private static final SingletonObject1 INSTANCE = new SingletonObject1();

  public static SingletonObject1 getInstance() {
    return INSTANCE;
  }

}

线程安全,类加载时就创建实例,java内部就使用到了这种方式。

技术分享图片
技术分享图片

双重锁判断

public class SingletonObject2 {

  private SingletonObject2() {
  }

  private static volatile SingletonObject2 INSTANCE;

  public static SingletonObject2 getInstance() {
    if (INSTANCE == null) {
      synchronized (SingletonObject2.class) {
        if (INSTANCE == null) {
          INSTANCE = new SingletonObject2();
        }
      }
    }
    return INSTANCE;
  }

}

new一个对象之后,这个对象可能还没有完全构造成功,另外的线程使用就可能出问题,volatile关键字可以禁止指令重排序,避免此问题。

静态内部类

public class SingletonObject3 {

  private SingletonObject3() {
  }

  private static class SingletonObject3Holder {

    private static final SingletonObject3 INSTANCE = new SingletonObject3();
  }

  public static SingletonObject3 getInstance() {
    return SingletonObject3Holder.INSTANCE;
  }

}

jvm保证线程安全性,延迟加载,推荐使用。

枚举

public enum SingletonObject4 {

  INSTANCE;

  public static SingletonObject4 getInstance() {
    return INSTANCE;
  }

}

jvm保证线程安全,并且可以防止反射攻击和反序列化攻击。
技术分享图片
技术分享图片

java实现单例模式的各种写法

原文:https://www.cnblogs.com/strongmore/p/14730984.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!