关注
AQS(AbstractQueuedSynchronizer)是Java并发包中非常重要的一个基础组件,它是一种用于构建锁和其他同步工具的框架。AQS是一个基于FIFO等待队列实现的锁和同步器的框架,提供了一种相对简单却非常强大的方式来实现阻塞锁和相关同步器。
AQS的核心原理是通过一个双向队列来实现线程的排队等待,当一个线程获取锁失败时,会将该线程以及等待状态放入等待队列中,而后等待队列中的线程会按照先进先出的顺序逐个被唤醒,直到某个线程获取到锁为止。
在Java中,synchronize锁可以分为偏向锁、轻量级锁和重量级锁三种。其中,偏向锁和轻量级锁都是乐观锁,重量级锁则是悲观锁。当多个线程竞争同一把锁时,JVM会先尝试使用偏向锁或轻量级锁来提高效率,如果这两种方式都无法满足需求,那么JVM就会升级到重量级锁。
在synchronize锁升级过程中,JVM会首先尝试使用偏向锁。当第一个线程请求锁时,JVM会将锁的持有线程设置为该线程,并且在对象头中存储该线程的ID。当后续的线程请求锁时,JVM会先检查对象头中的ID是否为当前线程,如果是,则说明该线程已经持有锁,可以直接获取锁。如果不是,则说明该对象已经有线程持有锁了,那么JVM就会放弃偏向锁并升级到轻量级锁。
在轻量级锁的情况下,JVM会在对象头中存储锁记录指针,并且使用CAS(Compare And Swap)操作来尝试获取锁。如果CAS操作成功,则说明该线程获取到了锁,可以直接执行同步代码块。如果CAS操作失败,则说明该对象已经被多个线程持有锁了,那么JVM就会将锁升级到重量级锁。
在重量级锁的情况下,JVM会将所有等待该锁的线程加入到等待队列中,并且释放锁的持有线程。等待队列中的线程将不断尝试获取锁,直到获取到锁为止。由于重量级锁的实现方式是基于操作系统的底层锁机制,所以效率较低,仅适合于多个线程长时间等待的情况下使用。
总之
查看原帖
点赞 评论
相关推荐
11-26 20:40
哈尔滨理工大学 算法工程师 点赞 评论 收藏
分享
牛客热帖
正在热议
# 拼多多求职进展汇总 #
228951次浏览 2025人参与
# ai智能作图 #
17597次浏览 231人参与
# 北方华创开奖 #
65415次浏览 544人参与
# 25届秋招总结 #
388952次浏览 3876人参与
# 硬件兄弟们 甩出你的华为奖状 #
77340次浏览 623人参与
# 地方国企笔面经互助 #
6347次浏览 15人参与
# 阿里云管培生offer #
56458次浏览 1725人参与
# 实习,投递多份简历没人回复怎么办 #
2432690次浏览 34685人参与
# 哪些公司校招卡第一学历 #
32090次浏览 98人参与
# 在职场上,你最讨厌什么样的同事 #
5424次浏览 77人参与
# 实习与准备秋招该如何平衡 #
721458次浏览 8538人参与
# 我的实习求职记录 #
6114026次浏览 83905人参与
# 工作中,你有没有遇到非常爱骂人的领导? #
4547次浏览 46人参与
# 如果再来一次,你还会选择这个工作吗? #
106949次浏览 1076人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
9494次浏览 197人参与
# 实习想申请秋招offer,能不能argue薪资 #
35536次浏览 308人参与
# 牛客租房专区 #
4303次浏览 119人参与
# 腾讯求职进展汇总 #
206737次浏览 1693人参与
# 如果有时光机,你最想去到哪个年纪? #
27337次浏览 567人参与
# 中兴求职进展汇总 #
467458次浏览 2436人参与
# 华为工作体验 #
109815次浏览 853人参与
# 还记得你第一次面试吗? #
31023次浏览 438人参与