前言
以前我们在复习synchronized的时候,和lock一对比,总说它是一个重量级锁,性能很差,不如lock来的方便,但其实synchronized作为Java中元老级的关键字,很多jdk原始代码都有用到它,因此Java开发团队还是非常中意这个“私生子”的,所以为了给它减重,开发者也早在Java6就为synchronized专门设计了一套优化处理过程。
一、synchronized使用
- 加到方法上,锁就是这个对象,防止多个线程同时访问这个对象的synchronized方法;
- 加到静态方法,锁就是这个类的class对象,防止多个线程同时访问这个类的synchronized方法,对该类所有对象适用;
- 加到代码块,锁就是该代码块所在的对象,防止多个线程同时访问该代码块;
二、JVM对synchronized的实现方式
- 代码块同步:通过使用 monitorenter 和 monitorexit 指令实现的
- 同步方法:ACC_SYNCHRONIZED 修饰
三、Java对象头(存储锁类型)
了解锁升级之前,必须先知道Java对象头,正式对象头记录的信息才实现了锁升级过程中的线程判断。
Java对象:

Java对象头:包含两部分:MarkWord 和 类型指针

本文详细介绍了Java6中synchronized的优化,包括锁升级过程:无锁->偏向锁->轻量级锁->重量级锁。讨论了锁的状态、Java对象头的MarkWord、以及不同锁状态下的Mark Word内容。强调了锁升级的单向性和适应不同并发场景的重要性。
最低0.47元/天 解锁文章
1555

被折叠的 条评论
为什么被折叠?



