android开发首页投稿(暂停使用,暂停投稿)Java学习笔记

你见过这样的单例模式吗

2016-07-15  本文已影响1997人  SilenceDut

并发的学习与使用
通过单例模式理解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,是一种有名的无锁算法函数)实现原子操作。

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

上一篇 下一篇

猜你喜欢

热点阅读