导语
为了确保多线程场景下数据安全,使用锁机制一直是一种优秀的解决方案,但是再高并发场景下,对锁的竞争可能成为性能瓶颈。为此,有出现了一种新的解决方案,被称为是非阻塞同步的方案。这种实现方式不需要使用锁,但依然可以保证高并发场景下数据的一致性,这一次就主要来说说这种不通过锁机制来实现数据安全的方案。
无锁机制
理解CAS
基于锁的同步方式,也是一种阻塞的线程同步方式,无论是使用信号量、重入锁还是内部锁,受到核心资源的限制,不同的线程在锁竞争时总是不能避免等待,从而阻塞当前线程。为了避免出现这种问题,非阻塞同步的方式就被提出来。一种最简单的非阻塞同步的实现就是ThreadLocal,每一个线程拥有各自独立的变量副本,因此在并行计算的时候不需要相互等待。
下面介绍的CAS( Compare And Swap) 算法是一个比较常用的无锁并发控制方法,与锁机制实现相比较,无锁算法的设计与实现都复杂的很多,但由于其非阻塞性,它对死锁问题是先天性免疫,并且线程的相互影响也远远比基于锁的方式小。更重要的是,使用无锁的方式完全没有锁竞争带来的系统开销,也没有线程间频繁的上下文交换调度带来的开销,因此它要比基于锁机制的实现方式都更有优越性。
CAS算法的过程如下
包含三个参数,形式为CAS(V,E,N)。其中V表示要更新的变量,E表示预期值,N表示新值。仅当V的值等于E的值得时候,才会将V的值设置为N,如果V的值和E的值不同,说明已经有其他线程做了更新,则当前线程什么也不做。最后CAS返回当前V的真实值。CAS操作是抱着乐观的态度进行,它总是认为自己可以完成操作。当多个线程同时使用CAS操作一个变量的时候,只有一个线程可以操作成功,其余的线程都会失败。失败的线程不会被挂起,而是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃选择。基于这样的一个操作原理,CAS操作即使没有锁,也可以发现其他线程对当前线程的干扰,并进行恰当的处理。
在硬件层面,大部分的处理器都支持了原子
本文探讨了无锁机制在多线程场景中的应用,重点讲解了无锁实现的基础——CAS(Compare And Swap)算法。通过介绍CAS的工作原理和Java中的原子操作类,展示了无锁在并发控制中的优势,以及LongAdder如何通过优化提高性能。
订阅专栏 解锁全文
3221

被折叠的 条评论
为什么被折叠?



