Java中syn锁状态

原因:Monitor实现的锁属于重量级锁,里边涉及到了用户态和内核态的切换,进程的上下文切换,成本较高,性能差。

记录锁状态的位置:在 Java 对象头里,有一块结构,叫Mark Word,里面会记录锁的状态。Mark Word 会记录对象自身的运行数据,如哈希码、GC 分代年龄、锁状态标志、偏向时间戳(Epoch) 等。

锁有四种状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态

偏向锁状态:线程会在栈中新建一个锁记录Lock Record,锁记录中obj字段指向锁对象, 通过CAS指令将Lock Record的线程id存储在对象头的mark word中,同时也设 置偏向锁的标识为101,如果对象处于无锁状态则修改成功,代表该线程获得了偏向锁。

如果是当前线程已经持有该锁了,代表这是一次锁重入。设置Lock Record第部分为null,起到了一个重入计数器的作用。与轻量级锁不同的时,这里不会再次进行cas操作,只是判断对象头中的线程id是否是自己,因为缺少了cas操作,性能相对轻量级锁更好一些

轻量级锁状态: 在线程栈中创建一个Lock Record,将其obj字段指向锁对象。 通过CAS指令将Lock Record的地址存储在对象头的mark word中(数据进行交 换),如果对象处于无锁状态则修改成功,代表该线程获得了轻量级锁。

如果是当前线程已经持有该锁了,代表这是一次锁重入。设置Lock Record第一 部分为null,起到了一个重入计数器的作用。 每次锁重入都需要进行CAS

重量级锁状态: 对象头的Mark Word中就设置指向Monitor对象的指针 ,让对象与monitor关联,然后复述三个字段+字段存储的内容

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值