标签:设计模式 安全 内部类 mic 静态 单例类 情况 懒汉式单例模式 饿汉
单例模式:一个类只允许创建一个对象(或实例),那这个类就是一个单例类,这种设计模式就是单例模式。
单例模式所解决的问题:
实现单例模式的要点:
饿汉式单例模式:
1 public class IdGenerator { 2 private AtomicLong id = new AtomicLong(0); 3 private static final IdGenerator instance = new IdGenerator(); 4 private IdGenerator() {} 5 public static IdGenerator getInstance() { 6 return instance; 7 } 8 9 public long getId() { 10 return id.incrementAndGet(); 11 } 12 }
弊端:不支持延迟加载。
懒汉式单例模式:
1 public class IdGenerator { 2 private AtomicLong id = new AtomicLong(0); 3 private static IdGenerator instance; 4 private IdGenterator() {} 5 public static synchronized IdGenterator getInstance() { 6 if (instance == null) { 7 instance = new IdGenterator(); 8 } 9 return instance; 10 } 11 public long getId() { 12 return id.incrementAndGet(); 13 } 14 }
弊端:因为锁 sybchornized,函数并发度为 1.如果频繁加锁释放锁,那会导致性能瓶颈。
双重检测:只要 instance 被创建,即使再调用 getInstance() 方法也不会进入加锁逻辑中。
1 public class IdGenterator { 2 private AtomicLong id = new AtomicLong(0); 3 private static IdGenerator getInstance() { 4 if (instance == null) { 5 synchronized(IdGenerator.class) { 6 if (instance == null) { 7 instance = new IdGenerator(); 8 } 9 } 10 } 11 return instance; 12 } 13 public long getId() { 14 return id.incrementAndGet(); 15 } 16 }
静态内部类:
1 public class IdGenerator { 2 private AtomicLong id = new AtomicLong(0); 3 private IdGenerator() {} 4 5 private static class SingletonHolder { 6 private static final IdGenerator instance = new IdGenerator(); 7 } 8 9 public static IdGenerator getInstance() { 10 return SingletonHolder.instance; 11 } 12 13 public long getId() { 14 return id.incrementAndGet(); 15 } 16 }
枚举:
1 public enum IdGenerator { 2 INSTANCE; 3 private AtomicLong id = new AtomicLong(0); 4 5 public long getId() { 6 return id.incrementAndGet(); 7 } 8 }
标签:设计模式 安全 内部类 mic 静态 单例类 情况 懒汉式单例模式 饿汉
原文地址:https://www.cnblogs.com/callmewhat/p/12828063.html