悲观锁和乐观锁
悲观锁
悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次拿数据是都会上锁,如数据库中的行锁、表锁、读锁、写锁等操作都会上锁,java中的synchronized就是悲观锁的思想
任何的数据操作都会有数据加锁、用户态内核态切换、维护锁计数器和检查是否有被阻塞的线程需要被唤醒等操作
如:synchronized、ReentrantLock等都是悲观锁
ReentrantLock虽然使用的是CAS,但是其CAS是对于锁的获取,所以一开始就上锁了。与乐观锁在拿数据时不上锁的理念是不一样的,不是所有用了CAS操作的都是乐观锁
乐观锁
乐观锁总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候回判断一下在此期间别人有没有更新这条数据,可以使用版本号机制和CAS算法实现。乐观锁适用于读多写少的情况,可以提升吞吐量,如java的atomic包下的原子变量类就是使用了CAS来实现的乐观锁
乐观锁不需要线程挂起,所以也叫做非阻塞同步
如:Atomic类都是乐观锁