1.基于数据库的乐观锁和悲观锁
有个版本字段,更新的时候先读出来,更新的时候作为where条件update。如果控制版本是状态不是单向的话还是有ABA的问题。单向的没问题。
悲观锁在查询的时候就把数据给锁住。
2.基于jdk的乐观锁和悲观锁
synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁。
CAS操作的就是乐观锁,比较并替换。每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。这种乐观锁的问题:ABA问题,如果一直再循环对cpu的开销比较大。不能保证代码块的原子性 CAS机制所保证的只是一个变量的原子性操作,而不能保证整个代码块的原子性。