理解Java中的AQS

一、定义

AQS:AbstractQueuedSynchronizer(抽象队列同步器),是一个用于构建锁和同步器的抽象的同步框架。AQS 提供了一种可扩展的基础,允许开发者实现各种形式的同步控制机制
例如:独占锁(ReentrantLock)、共享锁(ReentrantReadWriteLock)、CountDownLatch 等都是基于 AQS 的同步机制实现的。

AQS 的核心思想基于队列的等待/通知机制。它维护了一个等待队列,线程通过排队在队列中等待获取锁或者资源。AQS 提供了一些基本的方法,允许子类来定义自己的同步逻辑。其中两个主要的模板方法是 acquire 和 release

  • acquire 方法用于线程获取锁或资源,如果获取不到就进入等待队列等待。
  • release 方法用于线程释放锁或资源,可能会唤醒等待队列中的其他线程。

AQS 的实现使用了模板方法模式,具体的同步器通过继承 AQS 并实现其中的抽象方法来定义自己的同步逻辑。

二、CountDownLatch

CountDownLatch 是 Java 中并发编程的一个工具类,用于实现线程等待。使用了 AQS 的基本机制,通过维护一个计数器,使得等待的线程能够在计数器减为零时被唤醒。

CountDownLatch 的主要方法是 countDown() 和 await():

  • countDown(): 每次调用都会将计数器减1。
  • await(): 调用线程会阻塞,直到计数器变为零。
import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) {// 创建一个CountDownLatch,设置初始计数器值CountDownLatch latch = new CountDownLatch(3);// 创建三个线程,并传递同一个CountDownLatch实例Thread worker1 = new Worker(latch, "Worker 1");Thread worker2 = new Worker(latch, "Worker 2");Thread worker3 = new Worker(latch, "Worker 3");// 启动三个线程worker1.start();worker2.start();worker3.start();try {// 主线程等待计数器变为零latch.await();System.out.println("All workers have completed their tasks.");} catch (InterruptedException e) {e.printStackTrace();}}
}class Worker extends Thread {private final CountDownLatch latch;public Worker(CountDownLatch latch, String name) {super(name);this.latch = latch;}@Overridepublic void run() {System.out.println(getName() + " is working.");// 模拟工作任务try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(getName() + " has completed its task.");// 每个线程完成任务时调用countDown()latch.countDown();}
}

三、ReentrantLock

ReentrantLock 是 java.util.concurrent.locks 包中用于实现可重入锁(Reentrant Lock)的类,使用 AQS 来实现同步。它提供了比传统的synchronized关键字更灵活的锁定机制。可重入锁允许线程在持有锁的情况下再次获取该锁,而不会发生死锁。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {public static void main(String[] args) {// 创建一个ReentrantLock实例Lock lock = new ReentrantLock();// 创建两个线程,并传递同一个ReentrantLock实例Thread thread1 = new Worker(lock, "Thread 1");Thread thread2 = new Worker(lock, "Thread 2");// 启动两个线程thread1.start();thread2.start();}
}class Worker extends Thread {private final Lock lock;public Worker(Lock lock, String name) {super(name);this.lock = lock;}@Overridepublic void run() {// 获取锁lock.lock();try {System.out.println(getName() + " has acquired the lock.");// 模拟工作任务Thread.sleep(2000);System.out.println(getName() + " is releasing the lock.");} catch (InterruptedException e) {e.printStackTrace();} finally {// 释放锁,确保在发生异常时也能释放锁lock.unlock();}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jumpserver中安装httpx

查看已安装的包 pip freeze # python -V # Python 2.7.5安装anyio 刚开始直接pip install httpx,未设置版本号,因已有idna2.7,所以出现版本不兼容的现象 anyio 3.0.0 requires idna>2.8, but you have idna 2.7 which is incompatible.…

船的最小载重量-算法

说明:题解完全是从leetCode上拉下来的,在这里只是作为一个备份,怕之后找不着了。同时也分享给大家,这个题目用了一个我之前从未遇到的思路。 原题:船的最小载重量-leetCode1101 题目(看懂题目了吗&#xff…

STM32 I2C的多设备通信协议设计与实现

在STM32微控制器上使用I2C进行多设备通信需要设计合适的通信协议,以确保每个设备能够正确识别并响应主设备的命令。在本文中,我们将针对STM32的I2C多设备通信协议进行设计与实现,并展示如何使用代码来实现此协议。 要实现STM32的I2C多设备通…

JavaScript快速入门四

文章目录 事件事件的绑定事件监听机制常见事件点击事件焦点事件加载事件鼠标事件键盘事件选择和改变表单事件 事件 概述:某些组件被执行了某些操作后,触发了某些代码的执行 事件的绑定 方法一:直接在 HTML 标签上,指定事件的属性…

自定义通用返回对象

目的:给返回对象补充一些信息,告诉前端这个请求在业务层面上是成功还是失败,以及具体的描述信息。 我们需要自定义错误码(因为前端的HTTP状态码默认的值比较少)和正常错误返回类。 ErrorCode : package …

python基础 - 变量

知识点1: print函数里可以用英文逗号, 分隔字符和变量,字符串要用双引号引起来,而变量名不用引起来,同时print的时候也可以直接写数学运算公式 知识点2: python里和用户交互的函数是input,但它有一个特点&…

街机模拟游戏逆向工程(HACKROM)教程:[18]分析的思路

在之前的文章,我们已经提及,得到玩家的血量,可以用这个分析出哪些想要的东西: 1、被敌人攻击 - 得到敌人某个技能的攻击力,自身的防御力。 2、被队友攻击 - 得到队友的攻击力。 3、被道具击中 - 得到道具的攻击力。 4、使用扣血技能 - 得到使用技能扣除的血量值。 5、…

pikachu_csrf通关攻略

csrf(get) 打开pikachu靶场: 1. 根据提示给的账户密码进行登录 2. 打开代理拦截数据包将拦截数据发送到已打开的burp中: 修改数据进行发包: 从上面的url可见,修改用户信息的时候,是不带任何不…

网易云音乐JS逆向分析

文章目录 页面分析抓包分析JS逆向分析代码编写 页面分析 先来分析一下页面 当我们点击播放按钮的时候,音乐开始播放。实际上这个逻辑背后的原理是这个按钮后面对应的是一个url,这个地址是通过ajax来进行局部刷新的。 所以我们可以通过抓包工具&#…

everything的使用技巧

搜索 如何使用布尔运算符? AND 是默认布尔运算符。 例如,搜索 abc 和 123,您可以: abc 123 OR搜索两个搜索项中任意一个,在两项中加上 | 。 例如,搜索 .jpg 或 .bmp,您可以: …

软件开发:大厂中的灰度发布到底是什么样的一个流程

前言 灰度发布是一种软件发布的策略,也被称为渐进式发布或部分用户发布。在灰度发布中,新版本的软件不会立即对所有用户进行全面发布,而是先选择一小部分用户进行测试和试用。这样可以在生产环境中逐步引入新功能或修复bug,以降低…

K8S搭建(centos)四、安装K8S

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

第二百八十三回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容,本章回中将介绍如何通过相机获取视频文件.闲话休提,让我们一起Talk Flutter吧。 1. …

linux环境开发工具---yum与vim

1.Linux软件包管理器yum 1.1什么是软件包 在学习linux过程中,我们常常会遇到某些指令用不了的时候,原因除了权限问题外,还有可能是你当前的linux环境并没有安装相应的软件包。而在Linux下载安装软件的办法有两个,一个是先下载所需…

Aspx漏洞总结

第一部分,.NET项目当中的dll都可以进行反编译: 在java中有很多jar包,而在.NET框架中的bin中对应有很多DLL文件,bin下面都是可执行文件,这些文件都是很多代码封装的,想要查看源码,都需要通过反编…

Microsoft Remote Desktop for Mac(远程桌面连接)激活版

Microsoft Remote Desktop是一款由微软开发的远程桌面连接工具,它允许用户从另一台计算机或移动设备远程连接到Windows桌面或服务器。 以下是该软件的一些主要特点和功能: 跨平台支持:Microsoft Remote Desktop支持Windows、macOS、iOS和Andr…

【Linux】Vagrant搭建Linux环境

1. Vagrant Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境。 1.1 安装Vagrant 从Vagrant官网下载安装包,执行安装。 1.2 安装VirtualBox 从官网下载…

VLM 系列——中文CLIP——论文解读

一、概述 1、是什么 CLIP 的中文版,训练使用2亿 图-文 对的对比学习(不是LLM的预测下一个token),是一个双塔模型(图像和文本各子拥有一个编码器)。由于对齐了图像和文本特征,可以用来做:图-图(文章中没有相关测试任务)、图-文、文-图、文-文(文章中没有相关测试…

【K8S 云原生】K8S之HPA自动扩缩容、命名空间资源限制、容器抓包

目录 一、HPA概述 1、概念 2、两个重要的组件: 3、HPA的规则: 4、pod的副本数扩容有两种方式: 4.1、手动扩缩容,修改副本数: 4.2、自动扩缩容HPA 二、实验部署: 1、部署HPA 2、实现自动扩缩容 三…

智慧博物馆信息化系统建设(2)

物联网智能感知综合平台 物联网感知综合平台是综合物联网应用共性特点,贯穿感知、传输、应用服务三层的共性功能模块、协议和平台等的总称。 “感知综合平台基础标准+应用子集标准”体系已被ISO/IEC JTC1 国际标准化组织和国家物联网基础工作组认可,“物联网感知综合平台+应…