当前位置: 首页 > 科技观察

如何在不使用synchronized和lock的情况下实现线程安全的单例?(2)

时间:2023-03-19 00:11:28 科技观察

如果你不那么挑剔,可以使用枚举、静态内部类和饿汉模式来实现单例模式。请参阅:Howtoimplementathread-safesingletonwithoutusingsynchronizedandlock?但是上面的方法底层也是用到了synchronized,那么有没有什么办法可以不使用synchronized和lock实现线程安全的单例呢?单例?答案是肯定的,那就是CAS。关于CAS,我在博客的一篇文章中介绍过他。很多乐观锁都是基于CAS实现的。这里简单介绍一下。详见乐观锁的一个实现——CASCAS是一种乐观锁技术。当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程可以更新变量的值,而其他线程如果所有线程都失败了,失败的线程不会被挂起,但会被通知这次比赛失败了,可以再试一次。JDK1.5中新增的java.util.concurrent(J.U.C)是基于CAS的。与synchronized的阻塞算法相比,CAS是一种常见的非阻塞算法实现。所以J.U.C的性能有了很大的提升。用CAS(AtomicReference)实现单例模式:!=singleton){returnsingleton;}singleton=newSingleton();if(INSTANCE.compareAndSet(null,singleton)){returnsingleton;}}}}代码比较简单,稍微了解一下原理就可以理解原子参考。如果不明白,建议看一看,了解一下这些CAS的实现。使用CAS的好处是不需要使用传统的锁机制来保证线程安全。CAS是一种基于忙等待的算法,依赖于底层硬件的实现。与锁相比,它没有线程切换和阻塞的额外消耗,可以支持较大的并行度。CAS的一个重要缺点是,如果忙等待一直执行不成功(一直处于死循环),会对CPU造成很大的执行开销。【本文为专栏作家霍利斯原创文章,作者微信公众号Hollis(ID:hollishuang)】点此阅读更多本作者好文