谈谈synchronized与ReentrantLock的区别?
zhuanlan.zhihu.com/p/126085068
synchronized 悲观锁
jdk1.6之前是重量级锁,悲观锁 jdk1.6之后分级, 无锁/偏向锁/轻量级锁/重量级锁 www.bilibili.com/video/BV123…
- 偏向锁: 只有一个线程修改此对象
- 轻量级锁: 超过1个线程修改此对象, 使用CAS争抢
- 重量级锁: 当修改此对象的线程特别多, CAS对CPU的消耗过多的时候, 升级为此锁
加在非静态方法上: 锁的是对象,例如 public
synchronized
void get() { } 加在静态方法上:
Lock与ReentrantLock的关系
各种锁概念
zhuanlan.zhihu.com/p/132563433
CAS(利用CPU的元子性指令)
无锁/乐观锁/自旋锁
类AtomicInteger
zhuanlan.zhihu.com/p/126384164
zhuanlan.zhihu.com/p/371067798
使用的汇编指令lock cmpxch, 将多CPU的总线(其实是北桥芯片)加锁
, 保证了元子性, 所以还是有锁的.
CAS会遇到ABA问题 问题: 当前线程读到值为A,而另外一个线程把值A修改为B,又修改回A或者第三个线程把B修改成A, 此时当前线程使用CAS更新会成功. 解决办法:使用递增的版本号解决 类: AtomicStampedReference