synchronized

synchronized锁

image-20220729095353537

无锁: 不锁住资源,多个线程中只有一个能修改资源成功,其他线程会重试

偏向锁: 同一个线程执行同步资源时自动获取锁资源 (有4.x 的启动时间)

轻量锁: 多个线程竞争同步资源时,没有获取资源的线程自旋等待锁释放

重量锁: 多个线程竞争同步资源时,没有获取资源的线程阻塞等待唤醒

Monitor: 一种同步工具,描述为一个对象。每一个java对象就有一把看不见的锁,称为内部锁或者Monitor锁。Monitor是线程私有的数据结构,每一个线程都有一个可用的monitor record 列表,同时还有一个全局可用的列表。每一个被锁住的对象都会一个monitor关联,同时monitor中有一个Owner字段存放拥有该锁的线程唯一标识,标识锁被这个线程占用。

偏向锁

一个线程一直访问同步代码块,线程自动获取锁。(线程A一直在拿锁,没有多线程竞争)

在线程获取,和释放锁时,不在通过CAS操作。偏向锁住要时在无多线程竞争的情况下,不通过CAS操作锁,只是替换Mark Word 的ThreadID 时一次CAS原子指令

偏向锁,在遇到其他线程尝试竞争偏向锁时,偏向锁的线程才会释放锁,线程不会主动释放偏向锁。偏向锁的撤销,需要等待全局安全点(没有字节码在执行),首先暂停拥有偏向锁的线程,判断锁对象是否处于锁定状态。撤销偏向锁后恢复到无锁、轻量锁、重量锁

轻量级锁

当锁时偏向锁的时候被另外的线程访问,偏向锁会升级为轻量锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。

虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝

,让后考吧对象头中的 Mark Word复制到锁记录中。拷贝之后虚拟机将使用CAS操作尝试对象的Mark Word 跟新为指向 Lock Record指针,并将Lock Record里的owner 指针指向对象的mark wored.

如果操作成功,当前线程就获取锁。失败,虚拟机检查对象的 Mark Word 是否指向当前线程栈帧,如果是说明当前线程已经拥有了这个对象锁,否则说明多个线程在竞争。

只有当前1个线程在等待通过自旋方式等待。自选超过一定次数,第三个线程来争取锁(A持有锁,B在自旋,C来尝试获取锁)轻量锁升级为重量锁。

底部

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值