乐观锁、悲观锁是从其使用角度来看。(PS:比如ReentrantLock内部实现用到了CAS和自旋来提高性能,但是从其使用角度来看,是用到了悲观锁的思想。)
乐观锁:顾名思义就是在操作时很乐观,认为操作不会产生并发问题(不会有其他线程对数据进行修改),因此不会上锁。但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS(compare and swap)算法实现。(PS:CAS是原子指令)
简单理解:这里的数据,别想太多,你尽管用,出问题了再修复,即操作失败后事务回滚、提示、更新数据。
原子类的通用实现:
悲观锁:总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加(悲观)锁。一旦加锁,当不同线程同时执行时,只会有一个线程可以执行,其他的线程在入口处等待,直到锁被释放。
从上面对两种锁的介绍,我们知道两种锁各有优缺点,不能认为一种好于另一种:
原文:https://www.cnblogs.com/wengle520/p/12368376.html