面试官:谈一谈你对synchronized的理解

Java中对象和Monitor

对象

对象中有对象头,实例数据

对象头(mark word)长啥样

hashcode,分代年龄,是否是偏向锁,加锁标识

Monitor

monitor 又称管程,也叫锁。是JVM层提供的,每一个对象对应一个monitor。

工作原理

  • 用了synchronized(obj)之后,对象的markword中就有个指针指向monitor的地址,并且monitor中的ownernull变为thread-1.
  • thread-2来抢占共享资源,发现monitor 已经被抢占了,就去阻塞队列里面排队,变成阻塞状态.
  • synchronized(obj) 执行完之后会唤醒阻塞队列中的线程,此时是非公平

轻量级锁

  • 加锁 每个线程在加锁的时候会产生一个锁记录,锁记录中的 lock-recoad-address 00 与 对象头中的markword cas交换,轻量级锁加锁成功
  • 冲突 同一个线程重新获取锁,会产生一个新的锁记录,因为已经加锁了,就cas不成功,锁记录的地址为null
  • 解锁 锁记录为null的话就表示是重入的锁,不为null就交换markword.

锁膨胀

  • 加锁 在刚才的冲突环节,如果不是自己的线程,那么会锁就会膨胀,对象的markword就指向Monitor地址 10 此时thread-1就进入entryList 阻塞队列中,等待唤醒.
  • 解锁 等thread-0 执行完之后,发现cas交换失败了,就会进行重量级锁的解锁,将Monitor 中的owner赋值null,并且唤醒EntryList中的线程.

偏向锁

  • 加锁 我们发现轻量级锁每次同一个线程还是需要cas检查,这也是很耗费性能的,JVM对这个进行了优化,默认是开启偏向锁.不采用锁记录和对象头交换的形式,而是直接将线程的地址和对象的markword交换,这样每次只需要看当前来的线程是本线程就不需要cas了.
相关推荐
zhangjw3413 分钟前
第36篇:Spring Boot进阶:Web开发+参数校验+全局异常处理
前端·spring boot·后端
倒流时光三十年15 分钟前
第一阶段 02 · Mapping 与数据类型(text vs keyword 是重点)
后端·python·django
Zane199423 分钟前
JMM 与 happens-before:一次搞懂 Java 内存模型
java·后端
用户2986985301431 分钟前
在线将 Word 文档转换为 TXT 格式:快速免费的方法
人工智能·后端
shepherd11138 分钟前
别再把 MCP 当成大模型的“手脚”:LLM 并不会直接调用 MCP
后端·ai编程·mcp
SimonKing39 分钟前
别再写 setter 了!MapStruct Plus vs MapStruct,谁才是 Bean 转换的真神?
java·后端·程序员
名字还没想好☜39 分钟前
Go for-range 循环变量陷阱:goroutine 里全打印同一个值(Go 1.22 前后差异)
开发语言·后端·golang·go
AI多Agent协作实战派42 分钟前
AI多Agent协作系统实战(二十五):Spring Boot静态资源同步:为什么你改了代码但线上还是旧的?
后端
码栈研说44 分钟前
Go 语言大白话入门 12 - JSON:工作里最常见的数据格式
后端·程序员
达达尼昂44 分钟前
AI Native 工程实践:如何为 Claude 5 设计更有效的上下文
android·人工智能·后端