悲观锁
认为线程安全问题一定会发生,因此在操作数据之前先获取锁,保证线程串行执行。
例如Synchronized,Lock都属于悲观锁。
乐观锁
认为线程安全问题不一定会发生,因此不加锁,只是在该更新数据时去判断有没有其他线程对数据进行了修改。
如果没有修改则认为是安全的,自己才更新数据。
如果已经被其它线程修改说明发生了安全问题,此时可以重试或异常。
乐观锁的关键是判断之前查询得到的数据是否有修改过,常见的判断方式有两种:
1.版本号法
案例中stock是电商秒杀商品的库存数,
先查询stock和版本号,判断stock是否大于0,版本号是否为1
是的话就扣减,版本号+1,否则报错。
CAS法
compare and set(比较和设置)
利用库存代替版本号,直接判断查询到的stock和设置时的stock是否一致,
一致的话就扣减库存,不一致就报错返回。