英文:CompareAndSwap
判断内存某个位置的值是否为预期值,如果是则更改为新值
说白了就是比较和交换
三行代码解释其作用:
首先我们创建AtomicInteger原子类,给他赋值为5,不了解原子类的可以暂时把他看成一个普通的Int类型。
然后调用compareAndSet(5, 6)方法,这个参数 5 跟atomicInteger 的值(5)进行对比,如果相等,则将参数值6赋值给atomicInteger ,结果返回true,如果不相等,不做任何处理,返回false
AtomicInteger atomicInteger = new AtomicInteger(5;
System.out.println(atomicInteger.compareAndSet(5,6)+
",atomicInteger :"+atomicInteger);
System.out.println(atomicInteger.compareAndSet(5,9)+
"atomicInteger :"+atomicInteger);
所以上述结果为:
true, atomicInteger :6
false, atomicInteger :6
思考:为什么要这样子的?有什么用?
根据JMM内存模型,内存在读取主内存变量时,会在本地变量拷贝一份,在后对拷贝的副本进行操作。
假设主内存有共享变量X=1,线程A和线程B,同时读到A并在直接的本地内存拷贝了副本X=1。
假设线程A对数据X进行操作X=10,并提交给主内存,此时主内存X=10。
而此时线程B的本地内存中X还是等于1,然后线程B对X进行操作,X++ (即X=2)并提交给主内存,此时主内存X变为X=2,而此前A的操作被冲走了,这就造成很大的安全问题。
CAS就是为了确保在本地内存数据向主内存提交时,主内存中的数据没有被其他线程改变,即主内存中的数据和本地内存中操作的数据一致。
这里暂时讲到思想,如果你想了解其底层或者缺点可以搜索unsafe方法,自旋锁,ABA问题。
如果你觉得有一点点帮助给个赞哟~