《Java并发编程的艺术》读书笔记——再论锁

再论锁

晚上去世纪楼考完了最后一门“体系结构”,很多同学在qq空间里发表感慨什么复习了好多最后没看懂英文题目设计模式选错了,当然,类图肯定是画错了。我只能说我已经对考试无感了,三把剑走天下。挂科肯定是挂不了的,但我确实已经不再牵挂考试了,反正已经复习不下去了,早已开启了寒假模式,想想这应该是我最后一个寒假了,还是不免有点感伤的。

在最开始的时候就讲到了锁,说到锁,就不得不说一下synchronized 这个关键词,synchronized通常是一个重量级的锁,可以用在方法头上,这时候锁是当前实例对象,如果方法是静态的,那么锁对象就是当前类的Class对象,也可以用在方法体内,这时候需要指定一个锁对象,也就是需要在synchronezed()的()中添加一个对象。

在Java内存分析中,对于一个对象来说,每个对象都有一个对象头,在对象头中就存有synchronized用到的锁,如果对象是数组对象,虚拟机就用3个字宽(3*4个字节)来存储对象头,如果是普通类型对象,就用2个字宽来存储对象头。Java对象头有一部分叫作Mark Word,在Mark Word中就存有对象的hashcode,分代年龄和锁标记位,当锁标记位变化时,Mark Word中存储的数据也会随之变化。
在JDK1.6之后,引入了偏向锁和轻量级锁,锁的状态一共有4种,级别从低到高分别是无锁、偏向锁、轻量级锁和重量级锁,并且锁可以从较轻量级向较重量级升级,但不能降级。
所谓偏向锁变是指通常一个线程会持续多次获得锁,如果每次都去申请获取锁,用完之后释放的话,未免有点浪费性能了,所以偏向锁就可以解决这种浪费。当线程进入同步块时,会在对象头和栈帧中的锁记录里存储锁偏向的线程ID,以后线程再进入或退出同步块就不需要再加锁和解锁了,而只需要简单地测试对象头中是否存储着指向当前线程的偏向锁。
轻量级锁是指在执行同步块之前,JVM会在线程的栈帧中创建一个记录锁的空间,并将对象头的Mark Word复制到这个空间中。如果能够复制成功,则获得锁,如果复制失败,则表示有其他线程在竞争锁。在释放锁的时候,JVM会将前面获得锁时复制空间的内存重写到对象头中,如果成功,则表示没有竞争,如果失败,则表示当前锁存在竞争,锁就会升级成重量级锁。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值