CAS机制

1.1 乐观锁 vs 悲观锁
乐观锁:乐观锁假设认为数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,才会正式对数据是
否产生并发冲突进行检测,如果发现并发冲突了,则让返回用户错误的信息,让用户决定如何去做。
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样
别人想拿这个数据就会阻塞直到它拿到锁。
1.2 CAS
compare and swap :比较并交换
多个线程都拷贝主内存的值到自己的工作内存,当修改后写回主内存时,会和原来拷贝时的进行比较,如果相同就就修改,并返回true,否则,不修改,返回false;
当多个线程同时对某个资源进行CAS操作,只能有一个线程操作成功,但是并不会阻塞其他线程, 所以CAS是一个乐观锁;
CAS机制
1.3CAS应用
一般可用于自旋锁; while (抢锁(lock) == 失败) { } ; 只要没抢到锁,就死等
针对不同的操作系统,JVM 用到了不同的 CAS 实现原理,简单来讲:
.java 的 CAS 利用的的是 unsafe 这个类提供的 CAS 操作;
.unsafe 的 CAS 依赖了的是 jvm 针对不同的操作系统实现的 Atomic::cmpxchg;
.Atomic::cmpxchg 的实现使用了汇编的 CAS 操作,并使用 cpu 硬件提供的 lock 机制保证其原子性。
简而言之,是因为硬件予以了支持,软件层面才能做到

1.4ABA问题
一个值从A变成B,然后又变成A,这之间的过程我们不知道. 对象可能会发生改变.
解决方案:引入版本号,保证不会出现老的值。