转载

java 锁总结

1.基于数据库的乐观锁和悲观锁

有个版本字段,更新的时候先读出来,更新的时候作为where条件update。如果控制版本是状态不是单向的话还是有ABA的问题。单向的没问题。

悲观锁在查询的时候就把数据给锁住。

2.基于jdk的乐观锁和悲观锁

synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁。

CAS操作的就是乐观锁,比较并替换。每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。这种乐观锁的问题:ABA问题,如果一直再循环对cpu的开销比较大。不能保证代码块的原子性 CAS机制所保证的只是一个变量的原子性操作,而不能保证整个代码块的原子性。

原文  https://segmentfault.com/a/1190000023279574
正文到此结束
Loading...