多线程-比较然后设置compareAndSet

核心类

是Unsafe

核心方法

compareAndSet(旧值,新值);

如何应用?

1.Unsafe.compareAndSet(旧值,新值);
2.自己写的应用类 //必须包含一个数据,这个数据就是旧值

最核心的东西,就是上面两个东西。

代码

自定义应用类{
    private Unsafe unsafe; //提供比较然后设置方法的功能
    private volatile int oldValue; //保存旧值
}
复制代码

具体步骤

1.读取旧值  //自定义应用类.oldValue;  
2.比较然后设置  //Unsafe.compareAndSet(旧值,新值);   
3.true,就设置新的值;false,就不设置 //Unsafe.compareAndSet(旧值,新值); 的返回结果
复制代码

应用场景

1.原子计数器AtomicInteger
2.显式锁AbstractQueuedSynchronizer

他们的实现,都是跟我们的自定义实现类是一样的原理,就是核心两步

1.private Unsafe unsafe; //提供比较然后设置方法的功能
2.private volatile int oldValue; //保存旧值
复制代码

比较,到底是在比较什么?到底是如何比较?

比较的到底又是哪些值?

本质是

1.自定义实现类.get旧值(); //这里的旧值,就是自定义类的数据
2.Unsafe.compareAndSet(旧值,新值); //这里的旧值,就是第一步读的数据
复制代码

旧值分别是哪个,弄清楚了。现在的问题是,Unsafe.compareAndSet(旧值,新值);里的旧值,到底是在和谁比较?还是和自定义实现类的数据进行比较。

因为第一步,和第二步,是两个操作,所以这两个操作不是原子的,因此,Unsafe.compareAndSet(旧值,新值); 的返回值才会有true或false两种情况。

真正原子的地方,是Unsafe.compareAndSet(旧值,新值);这个方法本身。即包含了1.比较校验数据2.设置新的数据,这两步操作。

猜你喜欢

转载自juejin.im/post/5de468236fb9a071823ca6f3