目录
1.什么是乐观锁
1.概念:
若共享资源被多个线程访问不会出现问题,则对其使用乐观锁,只有在共享资源被更新要提交的时候检查是否已经被其它线程更新
2.优缺点:
优点:
适用于写操作比较少的情况,能够提供较高的执行效率,不会产生死锁问题和线程阻塞问题
缺点:
若多次出现失败重试的情况,会大大影响性能;
只针对单个共享变量
3.实现方式
两种方式:CAS算法;版本号机制
2.CAS算法
1.概念
CAS:Compare And Swap,译为比较和交换
比较:比较的是 将要更新的变量值variable 和 期望值expected
交换:交换的是 将要更新的变量值variable 与 写入的新的变量值new
触发机制:只有当:variable = expected时,将new写入variable
2.优缺点
优点:
CAS是原子性的,可以保证操作过程中的一致性
缺点:
1.ABA问题:当线程第一次读到variable时,记录了variable的值(假设为A),要更新的时候又读了一次variable的值(假设为A),此时二者相等,开始更新数据,但这不能保证该variable在这过程中未被更新过(假设更新为B,但又更新回了A)。
2.更新失败导致资源消耗过多:CAS更新失败后,会采用自旋锁进行重复更新;若一直失败就一直更新直到更新成功,这期间会消耗更多的系统资源
3.版本号机制
1.概念:
为共享数据加了一个属性:版本号version,若共享数据被线程更新,则version+1;线程调用共享数据时,也会得到version的值,当线程需要进行更新操作时,会比较第一次得到的version值和最终提交时得到的version值是否一致,一致才会更新数据。