CAS机制

    技术2025-12-24  14

    1.1 乐观锁 vs 悲观锁 乐观锁:乐观锁假设认为数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,才会正式对数据是 否产生并发冲突进行检测,如果发现并发冲突了,则让返回用户错误的信息,让用户决定如何去做。 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样 别人想拿这个数据就会阻塞直到它拿到锁。 1.2 CAS compare and swap :比较并交换 多个线程都拷贝主内存的值到自己的工作内存,当修改后写回主内存时,会和原来拷贝时的进行比较,如果相同就就修改,并返回true,否则,不修改,返回false; 当多个线程同时对某个资源进行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,这之间的过程我们不知道. 对象可能会发生改变. 解决方案:引入版本号,保证不会出现老的值。

    Processed: 0.014, SQL: 9