设计模式——单例模式

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 }

 

以上是关于设计模式——单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块

设计模式之单例模式

设计模式之单例模式