乐观锁是一种乐观思想,认为读多写少。遇到并发写的可能性低,每次去拿数据的时候都认为别人不会去修改,所以不会上锁。但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,才去在写时先读取当前版本号,然后枷锁操作(比较更上一次版本号,如果一样则更新),如果失败,则要重复读-比较-写的操作。
JAVA中乐观锁基本都是通过CAS操作实现,CAS是一种原子更新操作,比较当前值跟传入的值是否一样,一样则更新,否则失败。
CAS详解,https://blog.csdn.net/qq_41282026/article/details/98089231
悲观锁是一种悲观思想,认为写多读少,遇到并发写的可能性高,每次去拿数据的时候都认为别人会修改,所以每次在写的时候都会去上锁,这样别人想读写这个数据就会 block 直到拿到锁。java中悲观锁就是 Synchronized, AQS框架下的锁则先尝试 cas 乐观锁去获取锁,获取不到才会转为悲观锁,如 Retreenlock。