码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java并发 | 17.[锁机制] 重量级锁(Monitor+自旋锁)


    文章目录

    • 1. 对象头
    • 2. Monitor概述
    • 3. 自旋锁(自适应自旋锁)概述
    • 4. 重量级锁(Monitor + 自旋锁)
      • 4.1. 适用范围
      • 4.2. 底层机制
    • 参考资料

    1. 对象头

    对象 = 对象头 + 对象的成员变量

    2. Monitor概述

    Monitor译为「监视器」或「管程」,此类对象由操作系统提供,每个Java对象都可以关联一个 Monitor 对象。

    Java对象与Monitor对象是一一对应的。如果使用 synchronized 给一个Java对象上了锁(重量级锁),该Java对象头中的 MarkWord 对应的指针就会指向一个唯一的 Monitor 对象。

    Java对象与Monitor对象

    Monitor中有三个变量,分别是Owner、EntryList和WaitSet,本文暂不讨论WaitSet

    • [Owner] 当某个线程 拥有锁,那么 Owner 就会指向该线程,表示 只允许该线程执行代码块。
    • [EntryList] 链表结构,当线程 没能抢到锁,那么该线程就会被加入到EntryList中。待拥有锁的线程执行完毕,就会根据JVM底层的算法机制,唤醒其中的一个线程并使之成为新的 Owner。

    3. 自旋锁(自适应自旋锁)概述

    自旋锁是指:若线程A获取锁失败,那它并不会立即阻塞,也不会放弃CPU执行时间,而是循环去 争抢锁(默认10次),期间若成功抢到锁则正常执行,若仍未抢到则宣告争抢失败,随即进行相关的操作(阻塞、进入EntryList)。

    而自适应自旋锁是指争抢的时间和次数不再固定,而是根据过往的竞争情况不断调整,自适应地确定更合适的争抢时间和次数。

    [为什么自旋] 因为进入休眠后再次唤醒将进行上下文切换,该操作相对而言更消耗性能,因此要尽可能让该线程抢到锁;

    [什么情况下适合自旋] 仅适合多核CPU时,如果是单核CPU则没有任何意义。

    4. 重量级锁(Monitor + 自旋锁)

    4.1. 适用范围

    • JDK1.6以前;
    • 竞争激烈(对象锁经常会被多个线程争抢)

    4.2. 底层机制

    jdk1.6以前,被 synchronized 锁住的对象将会上「重量级锁」。

    首先向操作系统申请一个 Monitor 对象,且obj对象头中 MarkWord 的指针将会指向这个 Monitor 对象。

    • [第一个获取锁的线程] 当第一个线程t1发现 Monitor 的 Owner 为null,则将 Owner 指向t1(拥有锁);
    • [其他想争抢锁的线程] 若其他的线程t2发现 Monitor 的 Owner 不为null,那t2会循环 争抢锁(自旋锁),若超过次数后依旧没抢到锁(默认10次),则会进入到 EntryList 中并进入 BLOCKED 状态。
    • [执行完毕] 若 Owner 对应的线程执行完毕,Owner 指针便会断开(释放锁),同时根据JVM底层算法唤醒其中一个线程,使之成为新的 Owner。

    多线程执行synchronized代码时

    参考资料

    [视频] 04.026-Monitor-对象头

    [视频] 04.027-Monitor-工作原理

    [文章] 从偏向锁是如何升级到重量级锁的

  • 相关阅读:
    Spring精讲:什么是BeanFactory?(附源码)
    milvus采坑一:启动服务就会挂掉
    电机学 基础概念 野火电机第四章 电机分类
    idea实现Docker 远程部署项目
    自动驾驶高效预训练--降低落地成本的新思路(AD-PT)
    【算法|动态规划No.20】leetcode416. 分割等和子集
    MySQL怎么加锁的?
    ubuntu创建账号和samba共享目录
    Servlet规范之注解与可插拔性
    IDEA 使用
  • 原文地址:https://blog.csdn.net/xyxyxyxyxyxyx/article/details/126648798
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号