前言:
理解:
- 悲观锁:在我使用的时候,你们可能会碰,所以我会锁起来,不让你们接触。
- 乐观锁: 在我使用的时候,你们很可能不会使用,我懒的加锁,等我最后使用完看看你们碰没碰在处理。
- 乐观锁的实现:版本号比较,和CAS(需要双重判断)
- 互斥锁可以理解为悲观锁,比如synchronize,和ReentrantLock
- 悲观锁通常多用于写比较多的情况(多写场景,竞争激烈),这样可以避免频繁失败和重试影响性能,悲观锁的开销是固定的。
- 不过,如果乐观锁解决了频繁失败和重试这个问题的话(比如LongAdder使用空间换时间),也是可以考虑使用乐观锁的,要视实际情况而定。
- 乐观锁通常多用于写比较少的情况(多读场景,竞争较少),这样可以避免频繁加锁影响性能。不过,乐观锁主要针对的对象是单个共享变量(参考java.util.concurrent.atomic包下面的原子变量类)。