你见过这样的单例模式吗

作者: SilenceDut | 来源:发表于2016-07-15 11:20 被阅读1997次

并发的学习与使用
通过单例模式理解synchronized,volatile
上两篇主要是常见的关于并发的一些知识,本篇将介绍一些自己平常不常用的一些并发相关的内容。
单例模式的一种新的方式
最近在读RxJava的源码时,见到了一种新的单例模式,可能是自己见识太少,之前对这种方式真的没见过,也可以说闻所未闻。由此引发了一些对Atomic**相关原子类的思考的研究,先看代码:

public class Singleton {    
    private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<Singleton>();    
    private Singleton (){}    
    public static  Singleton getInstance() {            
        for (;;) {            
            Singleton current = INSTANCE.get();                 
            if (current != null) {                
                return current;            
            }            
            current = new Singleton();            
            if (INSTANCE.compareAndSet(null, current)) {                
                return current;           
           }       
     }    
  }
}

先看下AtomicReference的源码:

只贴出主要涉及部分.png

AtomicReference是作用是对"对象"进行原子操作。通过源码可以看出,它是通过"volatile"和"Unsafe提供的CAS(比较与交换,Compare and swap,是一种有名的无锁算法函数)实现原子操作。

  • current是volatile类型。这保证了:当某线程修改value的值时,其他线程看到的value值都是最新的value值,即修改之后的volatile的值。
  • 通过CAS设置value。这保证了:当某线程池通过CAS函数(如compareAndSet函数)设置value时,它的操作是原子的,即线程在操作value时不会被中断。CAS是一种无阻塞的锁,采用不断比较设值的方式来避免并发问题,不会有锁的等待和上下文切换问题,性能消耗较小。

如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
这种方式既能够保证延迟加载又能保证原子性及实例的唯一性,代码也相对比较简洁。
通过并发的学习与使用,线程的阻塞和上下文的切换会带来一定的性能开销,尤其在高并发的环境下。
而原子变量可以避免优先级倒置和死锁等危险,竞争比较便宜,协调发生在更细的粒度级别,允许更高程度的并行机制等等

相关文章

  • 你见过这样的单例模式吗

    并发的学习与使用通过单例模式理解synchronized,volatile上两篇主要是常见的关于并发的一些知识,本...

  • 你真的会写单例吗?

    你真的会写单例吗? 摘录来源 单例的正确姿势 Java单例模式可能是最简单也是最常用的设计模式,一个完美的单例需要...

  • 单例模式(Java内部类加载顺序)

    你真的会写单例模式吗——Java实现Android设计模式源码解析之单例模式深度分析 Java 的枚举类型:枚举的...

  • 设计模式之单例模式详解

    设计模式之单例模式详解 单例模式写法大全,也许有你不知道的写法 导航 引言 什么是单例? 单例模式作用 单例模式的...

  • 八种单例模式的实现

    转自:这种佛系的方式讲解单例模式你见过吗? - 皮皮的小猪仔的文章 - 知乎https://zhuanlan.zh...

  • 设计模式

    手写单例模式(线程安全) 你知道几种设计模式?单例模式是什么?Spring中怎么实现单例模式?

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • 单例模式的优化方案

    参考:你真的会写单例吗? 单例模式最常见的就是懒汉式加载: 例: 当调用getInstance方法时才去创建对象,...

  • Java单例模式

    转载: 你真的会写单例模式吗-------Java实现 单例模式可能是代码最少的模式了,但是少不一定意味着简单,想...

网友评论

  • 3a1271aceb39:看了很多源码 用的最多的还是饿汉式的静态变量实现单例
  • karonl:之前在本介绍CAS的书章节中有见过类似的
  • _palm:请问第一种能单例能排除运行期的cpu指令重排序的干扰嘛?
    SilenceDut:@_palm 我理解你的意思,你说的指令重排序应该是current = new Singleton();这句吧,可以从两个return singleton对象的地方来分析。第一处,其他线程得打Singleton对象是从AtomicReference引用里通过get()方法得到的,这需要其他的线程的new Singleton对象时先存到这个AtomicReference引用里,这不会发生指令的重排序问题,或者当前线程自己new出来返回,此时就不会存在重排序问题。可以和上篇那个双重锁定式的单例模式对比分析下。
    _palm:@SilenceDut volatile 只是工具类声明了 for 内部的实例化如何保证?
    SilenceDut:@_palm volatile就有防止重排序
  • FXXX:阿三……卧槽,牛逼
  • 31b2de936492:这个是干货
    SilenceDut:@qomo :smile: 谢谢
  • 8c39eb438412:作为一个编辑器控,特别想知道文章里png图使用的是哪个编辑器
    lancely:@SilenceDut Atom
    SilenceDut:@sigon mac直接截的。。
  • Yi晚:控件

本文标题:你见过这样的单例模式吗

本文链接:https://www.haomeiwen.com/subject/amdyjttx.html