想象一下你和你的朋友们要在一张纸上写字画画。如果你们彼此不知道对方会不会修改同一个位置的内容,为了保险起见,每次只有一个人可以写,写完后要交给下一个人。这就是悲观锁的思想,即基于悲观的认为数据可能会产生冲突,所以需要在使用数据之前先加锁,确保每个人对同一位置的内容操作完毕后才能进行下一个位置的操作。
而乐观锁则认为在大多数情况下,不会出现并发冲突,所以每个人都不加锁,直接写字画画。当一个人写完后,将自己写的内容与原来的内容做比较,如果没有被其它人修改过,就提交更新。如果发现已经被其它人修改过,就返回错误信息让该人重新编辑。例如,你写了“我喜欢吃苹果”,但发现其中的“我”已被另一个朋友改成了“他”,那么你就要重新编辑成“他喜欢吃苹果”。这个机制实际上就是基于乐观锁的CAS(Compare And Swap)算法实现的。
总结一下:悲观锁的思想是在操作前悲观地认为会出现并发冲突,所以事先加锁,保证每一个操作完成后才能进行下一个操作;而乐观锁则是乐观地认为并发冲突的概率很小,而不加锁,但在提交更新时判断是否有冲突,有则返回错误信息。
悲观锁假设数据经常发生冲突,在操作前先加锁。乐观锁则在操作时不加锁,而在更新时检查是否产生冲突,如CAS算法所示。两者分别适用于不同的并发场景,以保证数据的一致性。
843

被折叠的 条评论
为什么被折叠?



