并发JavaJava 并发锁
- 分类
- Java 并发
- 难度
- 未设置
- 来源数
- 1
- 更新时间
- 2026/03/28 21:25
答案
首先在没有线程访问的情况下,资源处于无锁状态, 当有且仅有一个线程过来访问了,这是线程会判断资源的MarkWord是否存储了线程ID,如果没存储就修改为自己的线程ID,如果存储了就判断是否为自己的线程ID,是就直接进入执行。而当第二个线程进来的时候,此时它判断MarkWord的线程ID不是自己的,~~(就会使用CAS操作进行修改,修改成功就执行,修改失败则代表发生竞争,)~~此时就会发生锁膨胀,等待占有线程走到安全点时,会触发STW,然后判断线程是否执行完成,若执行完成,就释放偏向锁,即将MarkWord修改为默认值,然后线程B就可以重新获得偏向锁,如果执行未完成,则膨胀为轻量级锁,通过CAS自旋去竞争,当自旋失败达到一定次数时,再膨胀为重量级锁。
相关题目(5)
Java 并发并发JavaJava 并发锁
Java 并发并发JavaJava 并发
Java 并发并发JavaJava 并发
Java 并发并发JavaJava 并发
有哪些支持并发的集合?共源 1
Java 并发并发JavaJava 并发
元信息
审核状态: active
关联来源: 1
来源面经题(0)
这道题目前没有手动沉淀的面经题来源。
来源(1)
Java八股(并发).md
knowledge_noteQuestion 41: 介绍一下 synchronized 锁膨胀过程。
Source answer: 首先在没有线程访问的情况下,资源处于无锁状态, 当有且仅有一个线程过来访问了,这是线程会判断资源的MarkWord是否存储了线程ID,如果没存储就修改为自己的线程ID,如果存储了就判断是否为自己的线程ID,是就直接进入执行。而当第二个线程进来的时候,此时它判断MarkWord的线程ID不是自己的,~~(就会使用CAS操作进行修改,修改成功就执行,修改失败则代表发生竞争,)~~此时就会发生锁膨胀,等待占有线程走到安全点时,会触发STW,然后判断线程是否执行完成,若执行完成,就释放偏向锁,即将MarkWord修改为默认值,然后线程B就可以重新获得偏向锁,如果执行未完成,则膨胀为轻量级锁,通过CAS自旋去竞争,当自旋失败达到一定次数时,再膨胀为重量级锁。
Reviewed answer: 锁通常会经历无锁、偏向锁、轻量级锁,再到重量级锁的升级过程。单线程访问时可偏向;出现竞争后撤销偏向并升级为轻量级锁,通过 CAS 自旋竞争;自旋失败达到一定程度后再膨胀为重量级锁。