【JUC-6】AQS介绍,基于AQS实现自己的锁

news/2024/11/16 20:44:47/

什么是AQS

AbstractQueuedSynchronizer(抽象队列同步器,简称AQS)出现在JDK 1.5中。AQS是很多同步器的基础框架,比如ReentrantLock、CountDownLatch和Semaphore等都是基于AQS实现的。除此之外,我们还可以基于AQS,定制出我们所需要的同步器。注意AQS是同步器辅助我们更快捷的实现各种锁的框架, 并不是锁!!!

基于AQS实现自己的锁

由于AQS类中, 很多方法都是final的方法, 其实我们只需要重写部分方法就可以了. 可重写方法如下图, 而且这些方法AQS是要求使用者必须自己实现的, 否则会抛出UnsupportedOperationException异常.

在这里插入图片描述

自定义实现同步器:

import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;/*** 同步器类*/
public class MySynchronizer extends AbstractQueuedSynchronizer {@Overrideprotected boolean tryAcquire(int arg) {// cas修改锁状态, compareAndSetState方法是AQS中的方法if (super.compareAndSetState(0, 1)) {// cas修改状态成功, 即加锁成功. 设置owner线程super.setExclusiveOwnerThread(Thread.currentThread());}return false;}@Overrideprotected boolean tryRelease(int arg) {setExclusiveOwnerThread(null);// state是volatile修饰的, 有写屏障, 所以放在setExclusiveOwnerThread方法后执行. 可以保证exclusiveOwnerThread的可见性setState(0);return true;}/*** 是否持有独占锁* @return*/@Overrideprotected boolean isHeldExclusively() {return getState() > 0;}public Condition newCondition() {return new ConditionObject();}
}

自定义实现锁

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;/*** 自定义不可重入锁*/
public class MyLock implements Lock {private MySynchronizer sync = new MySynchronizer();/*** 加锁, 加锁失败, 进入队列等待*/@Overridepublic void lock() {sync.acquire(1);}/*** 可打断的加锁* @throws InterruptedException*/@Overridepublic void lockInterruptibly() throws InterruptedException {sync.acquireInterruptibly(1);}/*** 尝试加锁, 加锁失败返回;不会等待* @return*/@Overridepublic boolean tryLock() {return sync.tryAcquire(1);}/*** 尝试加锁, 有等待时间* @param time the maximum time to wait for the lock* @param unit the time unit of the {@code time} argument* @return* @throws InterruptedException*/@Overridepublic boolean tryLock(long time, TimeUnit unit) throws InterruptedException {return sync.tryAcquireNanos(1, unit.toNanos(time));}/*** 解锁*/@Overridepublic void unlock() {sync.release(1);}/*** 创建条件变量* @return*/@Overridepublic Condition newCondition() {return sync.newCondition();}
}

http://www.ppmy.cn/news/696559.html

相关文章

OPA2376AIDGKR

OPA2376AIDGKR 规格 产品属性 制造商:Texas Instruments 产品种类:精密放大器 RoHS: 详细信息 系列:OPA2376 通道数量:2 Channel GBP-增益带宽产品:5.5 MHz SR - 转换速率 :2 V/us CMRR - 共模抑制比:90 dB 每个通道的输出电流:50 mA Ib - 输入偏流:0.2 pA Vos - 输入偏置电压 …

核芯国产高压运放CLA4031/ CLA4032

核芯互联发布高压宽带运放CLA4031(单通道)和CLA4032(双通道)。CLA403x是超低电压噪声、高速电压反馈放大器,适用于需要低电压噪声的应用,如通信、成像、ADC驱动、压控振荡器等。 CL403X支持1.5V~20V&#…

AH463全极高灵敏低功耗霍尔开关

AH463全极高灵敏低功耗霍尔开关 全极小功耗霍尔开关,推挽式输出,内置上拉电阻,高灵敏度。 霍尔元件AH463是基于CMOS工艺设计和生产的霍尔IC,元件内部集成了霍尔效应片、电压调节器、休眠唤醒控制电路、信号放大滤波电路、偏移补偿…

SP4533芯片

SP4533是TPOWER芯片全新推出的同步充放1A双灯显低成本同步升压五合一芯片,支持充电电流1A , 放电电流1A。双灯显的低成本移动电源终极解决方案. 是一款专为移动电话设计的同步升压的单芯片解决方案,内部集成了线性充电管理模块,同步放电管理…

MSP430FG479芯片的 IAP

MSP430以一款TI出品的16位超低功耗、具有精简指令集(RISC)的混合信号处理器,优点就是低功耗,运算快。在公司内用在一款开发中的低功耗传感器上,主要开发人员出国旅游一段时间,暂时给我代码熟悉一下&#xf…

MCU ARM 32bit LPC4357FET256 STM32L072CZU6TR PDF技术资料

1、LPC435X/3X/2X/1X是基于ARM Cortex-M4的浮点微控制器。用于嵌入式应用程序的单元(FPU),包括ARM Cortex-M0协处理器到1mb闪存和136kb片上SRAM, 16kb EEPROM存储器,两个高速USB控制器,以太网,LCD,一个外部内存控制器&…

SUB 1G 无线射频芯片-DP4301

DP4301是一款高性能低功耗的单片集成收发机,工作频率可覆盖200M-1020MHz,支持支持 230/315/408/433/868/915频段。该芯片集成了射频接收器、射频发射器、频率综合器、GFSK调制器、GFSK解调器等功能模块。通过SPI接口可以对输出功率、频道选择以及数据包格…

MSP430F5438学习笔记 UART ACLK 9600-8-N-1

1.初始化UART0之前需要先初始化ACLK、SMCLK和MCLK。示例代码中使用XT1,ACLK为32768,SMCLK和MCLK约为8MHZ。 2.UART的时钟可以参考ACLK或者SMCLK,本例参考ACLK。由于参考ACLK时钟,所以串口速率不能超过32768。选择9600较为合适。 …