• java 偏向锁怎么升级为轻量级锁


    因为偏向锁,锁住对象时,会写入对象头相应的标识,我们先把对象头(官方叫法为:Mark Word)的图示如下(借用了网友的图片):

          

     

     

        通过上面的图片,我们可以知道,对象处于偏向锁时,mark word中的偏向锁标记为1,锁标志位为01;下面是分析过jvm源码(biasedLocking.cpp)解析的偏向锁升级流程(忽略一些细节),示例中:线程1当前拥有偏向锁对象,线程2是需要竞争到偏向锁。

    1. 线程2来竞争锁对象;
    2. 判断当前对象头是否是偏向锁;
    3. 判断拥有偏向锁的线程1是否还存在;
    4. 线程1不存在,直接设置偏向锁标识为0(线程1执行完毕后,不会主动去释放偏向锁);
    5. 使用cas替换偏向锁线程ID为线程2,锁不升级,仍为偏向锁;
    6. 线程1仍然存在,暂停线程1;
    7. 设置锁标志位为00(变为轻量级锁),偏向锁为0;
    8. 从线程1的空闲monitor record中读取一条,放至线程1的当前monitor record中;
    9. 更新mark word,将mark word指向线程1中monitor record的指针;
    10. 继续执行线程1的代码;
    11. 锁升级为轻量级锁;   
    12. 线程2自旋来获取锁对象;
  • 相关阅读:
    CAS在tomcat6.0.18下的SSO
    CAS在tomcat6.0.18下的SSO
    PL/SQL 0.几秒出结果,SQL效率一定高吗?
    优化大型复杂SQL
    C++ ProtoBuf小结
    protobuf c++入门
    Oracle_inner join,left join,right join,full join 的区别,用例子说明
    Linux_查看修改SWAP大小
    Oracle 优化器
    Oracle 行转列两种方法
  • 原文地址:https://www.cnblogs.com/baxianhua/p/9391981.html
Copyright © 2020-2023  润新知