Java锁

3 阅读1分钟

www.bilibili.com/video/BV1xT…

zhuanlan.zhihu.com/p/90685902

image.png

谈谈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的关系

blog.csdn.net/u011195313/…

各种锁概念

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

对象结构

image.png

对象头

image.png