阿里面试题-锁的升级和种类详解

在多线程并发编程中synchronize一直是元老级别的存在,很多人称呼为重量级锁,但是随着JDK1.6之后,有些情况下就不显得那么重了。

一、对象锁(方法锁)实例与分析

  类中非静态方法上的锁;用this做锁;

二、类锁实例与分析

    类中静态方法上的锁;用XXX.class做锁;

三、引用对象作为锁,代码块实例与分析

     用类中的成员变量引用做锁;

      当一个线程试图访问同步代码块的时,它受限必须得到锁,退出或者抛出异常的时候必须释放锁。那么锁到底存在哪里呢?锁里面有哪些信息呢?

      从JVM规范中可以看到Synchronized在JVM里面的实现原理,JVM基于进入和退出Monitor对象来实现同步和代码块的同步,但两者的实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现的,而方法的同步同样可以使用这两个指令来实现的,细节JVM规范里面没有详细说明,但是方法的同步同样可以使用这两个指令实现。

      monitorenter指令实在变异后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处,JVM要保证每个monitorenter与之关联,当且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象对应的monitor的所有权,即尝试获取对象的锁。

偏向锁的撤销

偏向 使用了一种等到 争出 的机制,所以当其他 线 尝试竞 争偏向 锁时
持有偏向 线 程才会 。偏向 的撤 ,需要等待全局安全点(在 时间 点上没有正
行的字 节码 )。它会首先 有偏向 线 程,然后 检查 持有偏向 线 程是否活着,
如果 线 程不 于活 头设 置成无 ;如果 线 程仍然活着, 有偏向
会被 行,遍 偏向 象的 锁记录 中的 锁记录 Mark Word 要么重新偏向于其他
线 程,要么恢复到无 或者 标记对 象不适合作 偏向 ,最后 停的 线 程。 2-1 中的 线
1 演示了偏向 初始化的流程, 线 2 演示了偏向 的流程。
 
关闭偏向锁
偏向 Java 6 Java 7 里是默 启用的,但是它在 用程序启 几秒 之后才激活,如
有必要可以使用 JVM 参数来关 -XX:BiasedLockingStartupDelay=0 。如果你确定 用程
序里所有的 通常情况下 争状 ,可以通 JVM 参数关 偏向 -XX:-
UseBiasedLocking=false ,那么程序默 级锁
 
2. 级锁
1 级锁
线 程在 行同步 之前, JVM 会先在当前 线 程的 栈桢 建用于存 储锁记录 的空 ,并
中的 Mark Word 复制到 锁记录 中,官方称 Displaced Mark Word 。然后 线 尝试 使用
CAS 中的 Mark Word 换为 指向 锁记录 的指 。如果成功,当前 线 ,如果失
,表示其他 线 ,当前 线 程便 尝试 使用自旋来
2 级锁
锁时 ,会使用原子的 CAS 操作将 Displaced Mark Word 回到 ,如果成
功, 表示没有 生。如果失 ,表示当前 存在 争, 就会膨 成重量 级锁 2-2
两个 线 程同 夺锁 的流程
 
参考:并发编程的艺术

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_24837327

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值