悲观锁与乐观锁

一世执手 提交于 2020-02-20 09:14:10

悲观锁

我悲观地认为,我只能通过加锁来解决高并发带来的数据错误问题。

思想:

为查询到的数据进行加锁,当A读这个数据的时候,B就无法读取数据,这解决了问题,但是要知道,加锁的时候消耗很多资源。

乐观锁

我乐观地认为,我可以不通过加锁的方式,就可以解决高并发带来的数据错误问题。

乐观锁的思想主要就是CAS,即Compare And Swap。

当要对查询到的数据进行操作之前,保存一份旧值,当需要修改数据的时候,进行比对,如果说跟原来一样,那就说明没人动过这份数据,可以继续进行,否则的话,说明数据有可能出现并发修改的数据错误,那就不再进行数据修改的操作。

以此来保证数据的正确性。

乐观锁的弊端即解决方案

CAS思想会引发ABA问题,即数据A经过修改变成了B,后面又变回了A,这对乐观锁处理并发问题是致命的,因为假如出现了ABA问题,CAS就会发现旧值和当前值相同,即会进行数据的修改,殊不知,数据已然被修改过。

一种比较典型的解决方案就是增加版本号字段,每次进行修改数据后,都让版本号+1,即使出现了ABA问题,版本号依旧是变的,从而能避免错误。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!