首页 > 其他 > 详细

设计模式--单例模式

时间:2019-10-06 21:31:08      阅读:90      评论:0      收藏:0      [点我收藏+]

设计模式--单例模式

单例模式应该算最简单的设计模式,但在Java中单例模式还是有不少坑的。

饿汉式

类初始化时直接加载,没有线程安全问题,但没有实现lazy loading

public class Singleton {
    private static Singleton instance = new Singleton();
    
    //私有化构造器
    private Singleton() {}
    
    //访问方法
    public static Singleton getInstance() {
        return instance;
    }
}

懒汉式,不加锁

不加锁,在多线程环境下会new出多个对象

public class Singleton{
    private static Singleton instance;
    
    private Singleton(){} 
    
    public static Singleton getInstance(){
        if(instance == null){
            instance = new Singleton(); 
        }
        return instance;
    }
}

懒汉式,加锁的双重校验

比较常见的一种写法,采用加锁的双重校验方式,不过个人不是很喜欢这种写法,毕竟代码比较长

public class Singleton {
  private static volatile Singleton instance;

  private Singleton() {}

  public Singleton getInstance() {
    if (instance == null) {
      synchronized (Singleton.class) {
        if (instance == null) {
          instance = new Singleton();
        }
      }
    }
    return instance;
  }
}

懒汉式,静态内部类

比较喜欢这种写法,和饿汉式比较类似,但通过类加载机制避免Singleton类初始化时加载这个单例,仅在需要的时候加载

public class Singleton {

    private Singleton() {}

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

枚举

这个比较爽,3行代码解决

public enum Singleton {
  INSTANSE
}

使用javap -p Singleton.class命令显示所有类和成员可以看出枚举其实是饿汉式的一种

public final class test.Singleton extends java.lang.Enum<test.Singleton> {
  public static final test.Singleton INSTANSE;
  private static final test.Singleton[] ENUM$VALUES;
  static {};
  private test.Singleton(java.lang.String, int);
  public static test.Singleton[] values();
  public static test.Singleton valueOf(java.lang.String);
}

设计模式--单例模式

原文:https://www.cnblogs.com/lz-0011/p/11628482.html

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