Synchronized详解

基础

内核态和用户态

系统指令分为不同执行级别,0 1 2 3,一般系统内核0级,用户3级。
在这里插入图片描述

Java对象头

Java对象的内存布局:对象头部(12字节)+ 数据+ 填充(凑够8字节倍数)
对象头部(12字节): 对象头(8字节) + 对象class指针(指针压缩4字节)
64位系统:对象头(8字节)
在这里插入图片描述

锁升级

  • 偏向锁和轻量级锁:用户空间完成
  • 重量级锁:调用内核完成

在这里插入图片描述

偏向锁

一般情况下,共享资源都是没有竞争情况的,所以并不需要加锁。

注意在多线程情况下,锁撤销会消耗很多系统资源。

在这里插入图片描述

自旋锁

如果这个锁有竞争,把偏向锁撤销掉,升级为自旋旋。
动作:把自己线程的LR记录在锁对象的对线头上。

自旋次数过多,消耗系统资源。

在这里插入图片描述

重量锁

操作系统级别的锁申请,linux mutex,cpu指令重3级到0级系统调用,线程挂起,进入等待队列,等待操作系统调用,在映射会用户空间。

锁升级:线程竞争加剧,有线程自旋超过10次或自旋线程超过CPU核数一半,但是1.6之后jvm加入了自适应自旋。
等待队列:在Synchronized源码中定义objectMonitor对象中有一个等待线程集合waitSet,去等待系统调用。

在这里插入图片描述
字节码实现:
在这里插入图片描述

重入锁

Synchronized是可重入锁。
重入次数记录必须记录,解锁几次要对应。

  • 偏向锁 自旋锁->线程栈->LR+1

hashcode:偏向锁hashcode记录在LR上。

  • 重量锁->objectmonitor字段上
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值