Java并发编程CAS与Atomic原子类

1.什么是 CAS

        CAS(Compare And Swap,比较并交换),通常指对一个变量,首先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值。
在Java中,CAS 操作是由 Unsafe 类提供支持的,该类定义了三种针对不同类型变量的 CAS 操
作。 以compareAndSwapInt为例 ,这四个参数分别是:对象实例(var1)、 内存 偏移量(var2)、字段期望值(var4)、字段新值(var5)

        进行cas操作时,首先var1对象根据字段内存偏移量,找到其在内存中对应的值,然后与var3进行比较,如果和var3相等,则将var5的值赋给var4,否则CAS失败。

        使用CAS可以保证原子性和可见性。使用CAS,当有多个线程对共享变量进行操作时,如果此时该变量已经被一个线程使用,则其他线程会进入阻塞等待,不断自旋重新尝试获取资源,知道该线程释放锁。这样就保证了一个共享变量原子操作 。

ABA问题

        对于这种情况,ThreadA想通过CAS将变量i=5改成i=3,我们都知道进行CAS时,都会于旧值进行比较看看是否相等,如果相等,cas会认为它没有被其他线程修改过。但是倘若ThreadB先将i=5改成了i=2,然后ThreadC又将i=2改回i=5,此时ThreadA在对i进行操作时,会认为它没有被修改过,这种情况下就出现了线程安全问题。

        因此Java中引用了原子引用类AtomicStampedReference其中有一个stamp变量用于记录版本,每次修改可以通过+1保证版本唯一性。这样就解决了ABA问题

你可能感兴趣的:(java并发编程,Java并发,CAS,java)