Java中 AQS面试题

一、AQS 是如何控制同步状态的?说说 AQS 的工作原理?

AQS 是通过一个int类型的变量state来控制同步状态的。AQS 既可以实现共享锁,也可以实现互斥锁,state根据锁的类型的不同表示的含义不同。

以互斥锁为例,多个线程 通过竞争 state变量的值来判断锁的状态,并通过 CAS 操作来保证同步状态 state 变更的原子性。

获取同步状态失败的线程会存储到一个双向链表中进行等待,并通过park()方法来阻塞自己,从而释放 CPU 的资源。

AQS 通过这 2 种机制来完成一个抽象的队列同步器,实现多线程之间同步访问。

二、AQS 为什么用双向链表呢?

  1. 双向链表允许常数时间复杂度完成节点的插入与删除操作,新的节点需要加入队列进行等待时,只需要修改pre和next指针,就可以把线程添加到队列尾部。同样线程移除操作也非常高效,针对频繁入队出队的同步控制也很重要。
  2. AQS 在设计上遵循先进先出获取锁原则,双向链表支持按顺序遍历。
  3. 在某些情况下,线程被取消或锁的持有者直接唤醒某个特定的等待线程时,双向链表能够提供从前往后或从后往前遍历,便于快速定位到特定节点进行操作。
  4. 双向链表使AQS 不仅可以从头开始唤醒等待线程,也可以从特定位置唤醒等待线程,这种灵活性单链表和数组难以实现。

三、说一下 AQS 中的 Condition 是如何实现线程的等待和通知机制的?它和wait/notify的区别?

Condition 内部提供了一个条件队列,专门用来管理调用了await方法被阻塞的线程,这线程在加入到这个条件队列之后,同时会释放锁,并挂起等待,然后被挂起等待的线程可以通过signal方法唤醒。

被唤醒的线程需要重新加入到 AQS 队列中去重新竞争锁,因为 Condition 是基于条件的等待机制,所以它必须结合锁来使用。

和wait/notify的区别:

        1、condition 能针对特定条件精准唤醒线程。

        2、condition可以为不同条件橱窗就不同的等待队列方便管理。

        3、condition是基于 API 设计,提供了更灵活的控制手段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/714181.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ui学习--UITableView

UI学习 UITableView基础UITableView协议UITableView高级协议与单元格总结 UITableView基础 UITableView作为iOS中的一个控件,用于以表格形式展示数据。例如通讯录好友,朋友圈信息等,都是UITableView的实际运用场景。 首先我们先要加入两个协…

苹果加大AI布局,上海新店开业昭示中国市场新动向

随着全球科技巨头纷纷进军人工智能领域,苹果公司亦不甘示弱,近期在上海静安新店的开业以及CEO蒂姆库克的一系列动作,都显示出苹果在AI方面的雄心壮志。这不仅是对未来技术趋势的积极回应,更是对市场竞争态势的精准把握。 库克的访…

CSS从入门到精通——动画:CSS3动画延迟和完成后状态的保持

目录 任务描述 相关知识 动画状态 动画完成时的状态 动画延迟 编程要求 任务描述 本关任务:用 CSS3 实现小车等待红绿灯的效果。效果图如下: 相关知识 为了完成本关任务,你需要掌握:1.动画状态,2.动画完成时的状…

奥特曼谈AI的机遇、挑战与人类自我反思:中国将拥有独特的大语言模型

奥特曼在对话中特别提到,中国将在这个领域扮演重要角色,孕育出具有本土特色的大语言模型。这一预见不仅彰显了中国在全球人工智能领域中日益增长的影响力,也预示着未来技术发展的多元化趋势。 ①奥特曼认为AI在提升生产力方面已显现积极作用&…

一文了解Redis

一.什么是Redis 与MySQL一样,Redis也是客户端服务器结构的程序,是基于内存的键值对存储系统,属于NoSQL的一种。与很多键值对数据库不同的是,Redis 中的值可以是由 string(字符串)、hash(哈希&a…

探索Chrome DevTools的高级技巧与隐藏功能

Chrome DevTools是网页开发者不可或缺的调试工具,它提供了丰富的功能,帮助开发者快速诊断和解决问题。然而,除了常见的功能,如元素检查、网络监控和JavaScript调试之外,DevTools还有许多不为人知的强大功能和技巧。本文…

Paragon NTFS for Mac 15软件下载-详细安装教程视频

​Paragon NTFS for Mac是Mac平台上一款非常优秀的读写工具,可以在Mac OS X中完全读写、修改、访问NTFS硬盘、U盘等外接设备的文件。这款软件最大的亮点简书可以让我们读写 NTFS 分区,因为在Mac OS X 系统上,默认状态下我们只能读取NTFS 分区…

有趣的傅里叶变换与小波变换对比(Python)

不严谨的说,时域和频域分析就是在不同的空间看待问题的,不同空间所对应的原子(基函数)是不同的。你想一下时域空间的基函数是什么?频域空间的基函数是什么?一般的时-频联合域空间的基函数是什么?小波域空间的基函数是什…

Win11安装WSA 安卓系统,然后再电脑安装APK文件

参考文章: https://blog.csdn.net/m0_56076343/article/details/122334759 https://blog.csdn.net/u012514495/article/details/120885242 在微软的网站下载 打开:https://store.rg-adguard.net/ ,如下图: 在 1 的那个地方&am…

二维数组与指针【C语言】

二维数组与指针 一维数组一维数组与指针二维数组二维数组与指针总结补充判断以下方式是否正确打印二维数组一维数组 int arr[] = {11, 22, 33, 44};arr:首地址(第一个元素的地址) 一维数组与指针 int arr[] = {11, 22, 33, 44};因为,arr表示的是首地址,等价于 int* p =…

谷粒商城实战(033 业务-秒杀功能4-高并发问题解决方案sentinel 2)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第332p-第p335的内容 熔断降级 开启对Feign远程服务的熔断保护机制 feign.sentinel.enabletrue 这里我们只是调用方加就行 被调用方不用加 正常…

PD19 Parallels Desktop 虚拟机 安装Windows10系统 操作步骤(保姆级教程,轻松上手)

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、打开pd 19 虚拟机,点击右上角文件,新建2、通过下载好的镜像安装Windows10系统。找到镜像文件位置,安装,配置2、显示安装完成,打开Windows10系统 三、运行测试1、打…

SQLAlchemy:filter()和filter_by()的微妙差异

哈喽,大家好,我是木头左! 在Python编程中,SQLAlchemy是一个强大的ORM(对象关系映射)工具,它允许使用Python代码来操作数据库。然而,对于新手来说,SQLAlchemy中的一些函数…

cocos开发的时候 wx.onShow在vscode里面显示红色

这个函数是在微信小游戏平台才会用到。 cocos识别不到wx这个变量。 可以改成下面的写法。 只要在变量前面加一个globalThis.就能识别这个变量了。也不报错了。 搞死强迫症了。orz 欢迎大家来玩我的微信小游戏。多多提意见啊。

【Java】图的初识

文章目录 【Java】图的初识图是什么图的基本组成部分图的类型图的表示方法图的常见操作 Java中图的表示方法邻接矩阵邻接表 常见操作图的遍历深度优先搜索(DFS)广度优先搜索(BFS) 结论 【Java】图的初识 图是什么 图是一种数学概念&#xf…

[Linux] TCP协议介绍(1): TCP协议 数据格式、可靠性的控制、标记位... 简单介绍

上一篇文章, 针对UDP协议的格式、数据等内容做了一些简单的介绍. 并且提到, 在网络协议栈TCP/IP模型的传输层中, 有两个最具代表性的协议: UDP和TCP 下面就简单介绍分析一下TCP协议 TCP协议, 完整的称呼其实叫: 传输控制协议(Transmission Control Protocol) 从名字就可以看出…

Vue51-插件

一、插件的定义 vue里面的插件,类似于游戏的外挂。 vue中插件的本质:一个对象,里面必须包含install方法。 二、插件的使用 2-1、创建一个插件js文件(写在src中plugins.js) 2-2、应用插件:Vue.use(插件) …

基于Python+OpenCV高速公路行驶车辆的速度检测系统

简介: 基于Python和OpenCV的高速公路行驶车辆的速度检测系统旨在实时监测高速公路上的车辆,并测量它们的速度。该系统可以用于交通监控、道路安全管理等领域,为相关部门提供重要的数据支持。 系统实现: 视频流输入:系…

Python学习打卡:day07

day7 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day753、列表的常用操作课后练习题54、列表的循环遍历列表的遍历—— while 循环列表的遍历—— for 循环while 循环和 for 循环的对比练习 55、元组…

解决使用Jmeter进行测试时出现“302“,‘‘401“等用户未登录的问题

使用 JMeter 压力测试时解决登录问题的两种方法 在使用 JMeter 进行压力测试时,可能会遇程序存在安全验证,必须登录后才能对里面的具体方法进行测试: 如果遇到登录问题,通常是因为 JMeter 无法模拟用户的登录状态,导…