设计模式——单例模式
Posted callmewhat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式——单例模式相关的知识,希望对你有一定的参考价值。
单例模式:一个类只允许创建一个对象(或实例),那这个类就是一个单例类,这种设计模式就是单例模式。
单例模式所解决的问题:
- 处理资源的访问冲突:多线程环境下,两个线程共享资源,存在相互覆盖的情况,解决方案:加锁将同一时刻仅允许一个线程调用资源。
- 表示全局唯一的类。
实现单例模式的要点:
- 构造函数需要 private 访问权限,避免外部直接 new 创建实例;
- 考虑对象创建时的线程安全问题;
- 是否支持延迟加载;
- getInstance() 性能是否存在瓶颈(是否加锁)
饿汉式单例模式:
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 }
以上是关于设计模式——单例模式的主要内容,如果未能解决你的问题,请参考以下文章