1. 基于数据库的乐观锁和乐观锁
有个版本字段,更新的时候先读进去,更新的时候作为 where 条件 update。如果管制版本是状态不是单向的话还是有 ABA 的问题。单向的没问题。
乐观锁在查问的时候就把数据给锁住。
2. 基于 jdk 的乐观锁和乐观锁
synchronized 是乐观锁,这种线程一旦失去锁,其余须要锁的线程就挂起的状况就是乐观锁。
CAS 操作的就是乐观锁,比拟并替换。每次不加锁而是假如没有抵触而去实现某项操作,如果因为抵触失败就重试,直到胜利为止。这种乐观锁的问题:ABA 问题,如果始终再循环对 cpu 的开销比拟大。不能保障代码块的原子性 CAS 机制所保障的只是一个变量的原子性操作,而不能保障整个代码块的原子性。