1 | public class ArrayList<E> { |
CAS实现原理
发表于
我们知道多线程操作共享资源时,会出现三个问题:可见性、有序性以及原子性。
一般情况下,我们采用synchronized同步锁(独占锁、互斥锁),即同一时间只有一个线程能够修改共享变量,其他线程必须等待。但是这样的话就相当于单线程,体现不出来多线程的优势。
那么我们有没有另一种方式来解决这三个问题呢?
在上一章中,我们提到了一个volatile关键字,它可以解决可见性和有序性的问题。而且如果操作的共享变量是基本数据类型,并且同一时间只对变量进行读取或者写入的操作,那么原子性问题也得到了解决,就不会产生多线程问题了。
但是通常,我们都要先读取共享变量,然后操作共享变量,最后写入共享变量,那么这个时候怎么保证整个操作的原子性呢?一种解决方式就是CAS技术。
CAS(Compare and Swap)即比较并交换。在讲解这个之前,先了解两个重要概念:悲观锁与乐观锁