温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Synchronized锁的升级过程是怎样的

发布时间:2025-08-13 17:58:26 来源:亿速云 阅读:97 作者:小樊 栏目:编程语言

Java Synchronized锁升级过程遵循无锁→偏向锁→轻量级锁→重量级锁的单向路径,具体如下:

  1. 无锁状态:对象刚创建时,Mark Word中无锁标志,处于无锁状态。
  2. 偏向锁
    • 触发条件:第一个线程访问同步块时,JVM在对象头Mark Word中记录该线程ID,标记为偏向锁(锁标志位101)。
    • 特点:同一线程再次进入同步块时,无需同步操作,直接检查线程ID匹配即可获取锁。
    • 撤销条件:其他线程尝试获取锁时,偏向锁会被撤销,升级为轻量级锁。
  3. 轻量级锁
    • 触发条件:偏向锁撤销后,或直接由无锁状态进入(多线程交替访问场景)。
    • 实现方式:线程在栈帧创建锁记录(Lock Record),通过CAS操作将对象头指向该记录。
    • 升级条件
      • CAS失败超过阈值(默认10次,可通过-XX:PreBlockSpin调整)。
      • 检测到多个线程竞争(如第三个线程尝试获取锁)。
  4. 重量级锁
    • 触发条件:轻量级锁竞争激烈(自旋失败或大量线程阻塞)。
    • 实现方式:对象头指向操作系统互斥量(Mutex),线程进入阻塞状态,涉及用户态到内核态切换。
    • 特点:性能开销最大,但能保证高并发下的线程安全。

关键说明

  • 锁升级不可逆,一旦升级为重量级锁,即使竞争减少也不会降级。
  • 偏向锁在JDK 15后默认禁用,因撤销成本较高。
  • 可通过JVM参数(如-XX:+PrintSynchronization)观察锁状态变化。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI