1.悲观锁
多个线程竞争应用程序的共享资源
同时只有一个线程可以获得资源的使用权,其他线程阻塞等待
获得使用权的线程释放锁后,其他线程再次竞争资源的使用权限
2.乐观锁
多个线程竞争应用程序的共享资源
所有线程都可以获得资源的使用权,
只是使用共享资源读权限的线程,直接结束
使用共享资源写权限的线程,只有一个线程可以写成功
3.使用场景
悲观锁 | 乐观锁 |
---|---|
写多读少 | 读多写少 |
并发不高 | 高并发 |
不允许脏读 | 允许脏读 |
4.实现方案
Java | 数据库 | |
---|---|---|
悲观锁 | synchronized | select ...for update |
乐观锁 | java.util.concurrent包 --CAS | 使用版本号version控制 |
5.CAS方案的缺点
ABA问题---多个线程修改变量的值,可能经过几次修改,复合某一个线程的CAS条件,其实这个变量已经被修改了很多次 |
自旋CAS,不成功就一值执行下去,直至成功 |
只能保证一个变量的原子操作 |