码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式——单例模式

时间:2020-05-04 21:32:57      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:设计模式   安全   内部类   mic   静态   单例类   情况   懒汉式单例模式   饿汉   

单例模式:一个类只允许创建一个对象(或实例),那这个类就是一个单例类,这种设计模式就是单例模式。

单例模式所解决的问题:

  • 处理资源的访问冲突:多线程环境下,两个线程共享资源,存在相互覆盖的情况,解决方案:加锁将同一时刻仅允许一个线程调用资源。
  • 表示全局唯一的类。

实现单例模式的要点:

  • 构造函数需要 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 }

 

设计模式——单例模式

标签:设计模式   安全   内部类   mic   静态   单例类   情况   懒汉式单例模式   饿汉   

原文地址:https://www.cnblogs.com/callmewhat/p/12828063.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!