什么是乐观锁?
每次去取数据的时候都会认为别人没有修改过数据
在数据库表中添加一个记号version列,来记录版本号
每次修改的时候第一次读取版本号,修改之后再次读取版本号,如果版本号一致就修改,不一致则重新操作,直到更新成功
自身不上锁,所以性能比悲观锁好
什么是悲观锁?
每次去取数据的时候都会认为别人会修改数据
每次去拿数据的时候会上锁,其他线程想获取这个数据就只能等锁释放
用于写的场景比较多,把资源上锁,直到修改完成
CAS (compare and swap) 比较与交换算法实现
无锁算法,不用锁的方式直到变量更新完成,会操作三个值
V : 要更新的值
E : 预期的值
N : 新值
自旋锁
当一个线程在获取锁的时候,如果锁已经被其他线程所获取,那么线程会一直循环的尝试,直到锁获取到为止
ABA问题
如果变量V一开始读取的值A值,那么在修改的时候检查到仍然是A值
在此期间有可能被修改过其他值,然后又改回A
那么CAS算法就会认为它没有被修改过