立即学习:https://edu.csdn.net/course/play/26270/326874?utm_source=blogtoedu
一、乐观锁悲观锁的区别
1、为什么需要加锁?
为了保证多个线程更新一个资源时,防止数据冲突和脏乱,做到线程安全
2、乐观锁和悲观锁的区别:
二、Java提供的乐观锁实现
1、CAS乐观锁:
CAS有很大概率会失败,因为它是先比较后设置,很可能会被其他进程抢占资源。
举例:
AtomicInteger类中的compareAndSwapInt方法是native方法是调用JNI的方法,底层是通过一个CPU指令完成
2、CAS的自旋问题
常出现于资源竞争激烈时
3、CAS的ABA问题
AtomicStampedReference怎么处理ABA问题:设定时间戳,如果线程1在T1到T2时更新了value从A变为B再变为A。那么线程2在更新value时由于时间戳对应不正确会使其更改value值时失败。