关注
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会将所有等待该锁的线程加入到等待队列中,并且释放锁的持有线程。等待队列中的线程将不断尝试获取锁,直到获取到锁为止。由于重量级锁的实现方式是基于操作系统的底层锁机制,所以效率较低,仅适合于多个线程长时间等待的情况下使用。
总之
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 在大厂上班是一种什么样的体验 #
6758次浏览 97人参与
# 机械人避雷的岗位/公司 #
41881次浏览 279人参与
# 程序员找工作至少要刷多少题? #
12520次浏览 195人参与
# 12306一秒售罄,你抢到回家的票了吗? #
1106次浏览 38人参与
# 我现在比当时_,你想录用我吗 #
5505次浏览 80人参与
# 过年最难忘的一件事 #
23052次浏览 174人参与
# 你最满意的offer薪资是哪家公司? #
69479次浏览 349人参与
# 为了减少AI幻觉,你注入过哪些设定? #
2571次浏览 94人参与
# 牛客AI体验站 #
4686次浏览 142人参与
# AI Coding的使用心得 #
3431次浏览 90人参与
# 找工作的破防时刻 #
253032次浏览 1960人参与
# 刚入职的你踩过哪些坑 #
5290次浏览 111人参与
# 论秋招对个人心气的改变 #
7186次浏览 126人参与
# 一张图晒一下你的AI员工 #
3575次浏览 81人参与
# 关于春招/暑期实习,你想知道哪些信息? #
5280次浏览 96人参与
# 黄金这个事上,你学到了什么 #
1235次浏览 37人参与
# 机械人你知道哪些单休企业 #
85401次浏览 428人参与
# 程序员能干到多少岁? #
6678次浏览 100人参与
# 晒晒你司的新年福利 #
5400次浏览 82人参与
# 关于提前批我想问 #
267381次浏览 2305人参与