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

什么是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.hqwc.cn/news/5524.html

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

相关文章

机器学习11:逻辑回归-Logistic Regression

目录 1.计算概率 2.损失和正则化 2.1 逻辑回归的损失函数 2.2 逻辑回归中的正则化 3.参考文献 1.计算概率 许多问题需要概率估计作为输出。逻辑回归是一种极其有效的概率计算机制。实际上,我们可以通过以下两种方式使用返回的概率: 原始概率&…

git常用命令之远程仓库别名

12. 远程仓库别名 12.1 查看远程仓库名称 命令作用git remote查看关联的远程分支$ git remoteorigingit remote -v查看本地仓库关联的远程仓库信息$ git remote -vorigin gitgithub.com:kaku/reading-note-tutorails.git (fetch)origin gitgithub.com:kaku/reading-note-tuto…

59 KVM Skylark虚拟机混部-概述、架构及特性

文章目录 59 KVM Skylark虚拟机混部-概述、架构及特性59.1 Skylark概述59.1.1 问题背景59.1.2 总体介绍 59.2 架构及特性59.2.1 总体实现框架59.2.2 功耗干扰控制59.2.3 LLC/MB干扰控制59.2.4 CPU干扰控制 59 KVM Skylark虚拟机混部-概述、架构及特性 59.1 Skylark概述 59.1.…

Ubuntu 20.04.02 LTS安装virtualbox7.0

ubuntu22.04的软件仓库也有virtualbox,不过版本较老。 使用安装命令:sudo apt install virtualbox 如果想要安装最新版,那么需要去官网下载deb包或者使用官方的仓库。 这里采用安装Oracle官方仓库的方法。 执行如下命令: wge…

流量分析工具wireshark-学习笔记

(一)wireshark工具 1、wireshark工具简介 Wireshark是一种开源网络分析工具,它可以让你在计算机网络上捕获和查看数据包,并能帮助你深入了解网络的运行和协议的实现。它可以捕获不同类型的流量,包括以太网、Wi-Fi、TC…

02-独立按键控制LED状态

程序 #include <REGX52.H>void main() {while(1) {if(P3_1 0) //DOWN{P2_0 0xFE;}if(P3_1 1) //UP{P2_0 0XFF;}};}按键的抖动问题 软件实现解决-按键的抖动问题 通过延时解决 #include <REGX52.H>void Delay(unsigned int xms) {while(xms){unsigned cha…

计算机网络————网络层

文章目录 网络层设计思路IP地址IP地址分类IP地址与硬件地址 协议ARP和RARPIP划分子网和构造超网划分子网构造超网&#xff08;无分类编址CIDR&#xff09; ICMP 虚拟专用网VPN和网络地址转换NATVPNNAT 网络层设计思路 网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数…

排序算法--冒泡排序(Java语言)

冒泡排序&#xff08;Bubble Sort&#xff09;是啥&#xff1f; 冒泡排序是一种简单的排序算法。它重复地走访过要排序的元素列&#xff0c;依次比较两个相邻的元素&#xff0c;如果他们的顺序&#xff08;如从大到小、首字母从A到Z&#xff09;错误就把他们交换过来。走访元素…

Idea新建springboot项目遇到的问题及解决

1.更换阿里云 方法&#xff1a; 找到文件路径&#xff1a;Settings > Build,Execution,Deployment > Build Tools > Maven 如下图&#xff1a; 找到相应的settings文件 如果没有就新建一个同名文件&#xff0c;内容如下&#xff1a; <settings xmlns"h…

案例赏析 | 新疆喀什:“大型充电宝”扎根戈壁,让新能源供电更稳定

在喀什&#xff0c;你可以置身秘境&#xff0c;一睹帕米尔高原、乔戈里峰、“冰山之父”慕士塔格峰的壮丽&#xff1b;可以走进喀什古城&#xff0c;在街头巷尾、一砖一瓦间感受丝路风情&#xff1b;可以探访塔克拉玛干沙漠&#xff0c;开始一场关于冒险者的游戏&#xff1b;也…

基于深度学习的高精度绵羊检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度绵羊检测识别系统可用于日常生活中或野外来检测与定位绵羊目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的绵羊目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

html实现好看的多种风格导航菜单(附源码)

文章目录 1.设计来源1.1 顶部导航菜单1.1.1 界面风格1-一二级连体导航菜单1.1.2 界面风格2-二级导航下拉框1.1.3 界面风格3-系统开始风格1.1.4 界面风格4-购物类导航菜单1.1.5 界面风格5 - 带搜索扩展的导航条1.1.6 界面风格6-火热效果多级导航条 1.2 悬浮按钮菜单1.2.1 界面风…