设计模式之美学习-创建型-单例模式(十五)
作者:互联网
说明
从业务概念上,有些数据在系统中只应该保存一份,就比较适合设计为单例类。比如,系统的配置信息类。除此之外,我们还可以使用单例解决资源访问冲突的问题。
饿汉式
在类加载的时候就创建
public class IdGenerator { private AtomicLong id = new AtomicLong(0); //2.类加载的时候就初始化 private static final IdGenerator instance = new IdGenerator(); //1.构造函数私有化 private IdGenerator() { } //3.提供一个公共的静态方法 public static IdGenerator getInstance() { return instance; } public long getId() { return id.incrementAndGet(); } }
懒汉式
普通版本
public class IdGenerator { private AtomicLong id = new AtomicLong(0); private static IdGenerator instance; //构造哈数私有化 private IdGenerator() { } //加锁 避免并发的时候多次创建 public static synchronized IdGenerator getInstance() { if (instance == null) { instance = new IdGenerator(); } return instance; } public long getId() { return id.incrementAndGet(); } }
缺点:方法加了同步锁避免多线程并发 重复创建,但是当初始化后每次获取都会获取锁,性能不好
双重检测
public class IdGenerator { private AtomicLong id = new AtomicLong(0); private static IdGenerator instance; //构造函数私有化 private IdGenerator() {} public static IdGenerator getInstance() { if (instance == null) { synchronized(IdGenerator.class) { // 此处为类级别的锁 //二次判断是为了防止多线程在同步锁等待 第一个释放后 其余进入锁 会重复创建 if (instance == null) { instance = new IdGenerator(); } } } return instance; } public long getId() { return id.incrementAndGet(); } }
静态内部类
public class IdGenerator { private AtomicLong id = new AtomicLong(0); //构造函数私有化 private IdGenerator() {} //加载IdGenerator时SingleonHoldre并不会加载 private static class SingletonHolder{ private static final IdGenerator instance = new IdGenerator(); } //调用get方你发触发holder加载 public static IdGenerator getInstance() { return SingletonHolder.instance; } public long getId() { return id.incrementAndGet(); } }
标签:IdGenerator,之美,private,instance,static,单例,AtomicLong,设计模式,public 来源: https://www.cnblogs.com/LQBlog/p/12565861.html