参考:https://www.cnblogs.com/jyroy/p/11365935.html
乐观锁和悲观锁
悲观锁,操作共享数据先加锁。Java 语言中synchronized和ReentrantLock等就是典型的悲观锁,还有一些使用了synchronized关键字的容器类如HashTable等也是悲观锁的应用。
乐观锁,认为没有同时操作共享数据的可能,数据库层面用版本号实现。Java语言中java.util.concurrent.atomic包下的原子类就是使用CAS乐观锁实现的(运用操作系统CAS原子性实现)。
两种锁的使用场景
乐观锁适用于写比较少(冲突比较小)的场景,因为不用上锁、释放锁,省去了锁的开销,从而提升了吞吐量。
如果是写多读少的场景,即冲突比较严重,线程间竞争激励,使用乐观锁就是导致线程不断进行重试,这样可能还降低了性能,这种场景下使用悲观锁就比较合适。