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

news2024/11/17 3:23:42

什么是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 {


    @Override
    protected boolean tryAcquire(int arg) {
        // cas修改锁状态, compareAndSetState方法是AQS中的方法
        if (super.compareAndSetState(0, 1)) {
            // cas修改状态成功, 即加锁成功. 设置owner线程
            super.setExclusiveOwnerThread(Thread.currentThread());

        }
        return false;
    }

    @Override
    protected boolean tryRelease(int arg) {
        setExclusiveOwnerThread(null);
        // state是volatile修饰的, 有写屏障, 所以放在setExclusiveOwnerThread方法后执行. 可以保证exclusiveOwnerThread的可见性
        setState(0);
        return true;
    }

    /**
     * 是否持有独占锁
     * @return
     */
    @Override
    protected 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();


    /**
     * 加锁, 加锁失败, 进入队列等待
     */
    @Override
    public void lock() {
        sync.acquire(1);
    }

    /**
     * 可打断的加锁
     * @throws InterruptedException
     */
    @Override
    public void lockInterruptibly() throws InterruptedException {
        sync.acquireInterruptibly(1);
    }

    /**
     * 尝试加锁, 加锁失败返回;不会等待
     * @return
     */
    @Override
    public 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
     */
    @Override
    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
        return sync.tryAcquireNanos(1, unit.toNanos(time));
    }

    /**
     * 解锁
     */
    @Override
    public void unlock() {
        sync.release(1);
    }

    /**
     * 创建条件变量
     * @return
     */
    @Override
    public Condition newCondition() {
        return sync.newCondition();
    }
}

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

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

相关文章

关于LiveData全面详解(附事件总线)

前言:缤纷色彩闪出的美丽 是因它没有 分开每种色彩 前言 MVVM 架构模式中,ViewModel 是不会持有宿主的信息,业务逻辑在 ViewModels 层中完成,而不是在 Activities 或 Fragments 中。LiveData 在里面担任数据驱动的作用&#xff1…

ElementPlus的Collapse 折叠面板问题

我也不明白为什么会报这个错误,把关于ts的代码改成js的就可以了。。 ERROR in ./src/views/Home.vue?vue&typescript&langts&setuptrue (./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/views/Home.vue?vue&typescript&…

大厂经验,基于资产健康度量化的小米数据治理实践

摘要:随着小米公司各项业务的快速发展,数据中的商业价值也愈发突显。而与此同时,各业务团队在数据查询、分析等方面的压力同样正在剧增。小米大数据团队用大数据管理大数据,从存储、计算、规范、质量、安全五方面着手治理&#xf…

java swing实现JTextField文本框的输入提示补全功能,以登陆界面自动提示补全用户账号为例,自动填充账号密码

前言 如果您想了解更多的java项目功能源码,请订阅我的专栏: java项目源码合集100+ 一、实现的功能 在使用java做界面实现输入功能的时候,使用了JTextField文本输入组件,希望能够根据用户的输入,自动提示,之后用户可以选择提示的内容作为文本框的输入内容,效果如下: 当…

Java中的阻塞队列使用以及详解

文章目录 一、Queue接口1. 常见方法以及功能(不具有阻塞队列特性)1.1 add(E e)1.2. offer():1.3. remove()1.4. poll()1.5. element()1.6. peek() 2. add和offer对比:3. remove和poll对比:4. element#peek方法对比: 二、BlockingQueue阻塞队列…

MySQL:子查询(全面详解)

MySQL:子查询 前言一、需求分析与问题解决1、实际问题2、子查询的基本使用3、子查询的分类 二、单行子查询1、单行比较操作符2、代码示例3、HAVING 中的子查询4、CASE中的子查询5、子查询中的空值问题6、非法使用子查询 三、多行子查询1、多行比较操作符2、代码示例…

Unity VR 开发教程 OpenXR+XR Interaction Toolkit(八)手指触控 Poke Interaction

文章目录 📕教程说明📕XR Poke Interactor📕与 UI 进行触控交互⭐添加 Tracked Device Graphic Raycaster 和 XR UI Input Module 让 UI 可被交互 📕与物体进行交互⭐XR Simple Interactable⭐XR Poke Filter 往期回顾&#xff1a…

偏爱console.log的你,肯定会觉得这个插件泰裤辣!

前言 毋庸置疑,要说前端调试代码用的最多的,肯定是console.log,虽然我现在 debugger 用的比较多,但对于生产环境、小程序真机调试,还是需要用到 log 来查看变量值,比如我下午遇到个场景:选择完…

单片机-串口通信

1.串口向电脑发送数据 1.配置串口 T1定时器,方式二8位重装 void UartInit(void) //4800bps11.0592MHz {PCON & 0x7F; //波特率不倍速SCON 0x50; //8位数据,可变波特率TMOD & 0x0F; //清除定时器1模式位TMOD | 0x20; //设定定时器1为8位自动重装方式…

Win11桌面右键菜单怎么变成老版本?

Win11桌面右键菜单怎么变成老版本?Win11系统带来了许多新的功能和改进,其中一个显著的变化是Win11桌面右键菜单的设计和布局,所以有些用户就想把Win11桌面右键菜单变成老版本,那具体怎么操作,可以按照以下小编分享的方…

chatgpt赋能python:用Python关机:简单、快捷、高效的关机方式

用Python关机:简单、快捷、高效的关机方式 介绍 在我们使用计算机的日常生活中,关机是必不可少的一个要素。传统的关机方式通常是通过点击“开始”菜单——“关机”按钮来完成的。但是,使用Python可以让我们更加方便和高效地完成关机操作。…

海外媒体发稿:海外新闻发表文章的必要性

海外新闻发表文章,是指国外企业在当地新闻媒体上发表企业信息和企业企业形象活动,通过专业媒体网络资源,依靠技术专业的报道发稿平台,让国外企业迅速、精确、低成本开展海外新闻稿子的出台,根据媒体报导,提…

PyQt5入门1——PyQt5的安装与Hello World应用

PyQt5入门1——PyQt5的安装与Hello World应用 学习前言简介(From 百度百科)安装Hello World1、窗口构建a、构建基础类b、编写UI 2、主程序运行 全部代码 学习前言 搞搞可视化界面哈,虽然不一定有用,但是搞一下。 简介&#xff…

Makefile实战

文章目录 1、准备环境1.2、规则1.3、假目标1.4、变量1.5、自动变量1.6、函数addprefix 函数filter函数filter-out函数patsubst函数strip函数wildcard函数 1、准备环境 准备一台Linux机器,验证环境中是否呗正确安装了,使用make -v命令进行验证 1.2、规则 …

React中useState的setState方法请求了好多次

1、问题描述 最近在写react的时候碰到了一个很奇怪的问题。 可以看到那个getXXX()的方法一直不断的被调用,网页一直请求,根本停不下来了。 2、产生原因 要弄明白这个原因,首先要先了解一下react生命周期。 react是组件式的编程,一…

青岛大学_王卓老师【数据结构与算法】Week04_01_循环链表_学习笔记

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–…

GO SDK使用说明

简介 欢迎使用腾讯云开发者工具套件(SDK)3.0,SDK 3.0 是云 API 3.0 平台的配套工具。SDK 3.0 实现了统一化,各个语言版本的 SDK 具备使用方法相同、接口调用方式相同、错误码和返回包格式相同等优点。本文以 GO SDK 3.0 为例&…

chatgpt赋能python:用Python编写BMI计算器,实现身体指数(BMI)的快速计算和分析

用Python编写BMI计算器,实现身体指数(BMI)的快速计算和分析 在当今的健康意识逐渐增强的时代,身体指数(BMI)成为了一个非常重要的健康指标。BMI是根据身高和体重计算出来的数值,用于评估一个人…

java pdf2html 和html2pdf 两款插件

1 pdf2html docker 启动,java 调用服务即可转化 https://beltxman.com/2567.html docker run -ti --rm -v ~/pdf:/pdf -w /pdf docker.io/pdf2htmlex/pdf2htmlex:0.18.8.rc2-master-20200820-ubuntu-20.04-x86_64 test.pdf 2 html2pdf java .Runtime 类型调用命…

超详细讲解在Ubuntu 20.04上安装ROS Noetic Ninjemys并测试

文章目录 前言安装STEP-1: 配置Ubuntu软件仓库STEP-2: 设置sources.listSTEP-3: 设置密钥STEP-4: 更新Ubuntu软件包确保安装索引是最新的STEP-5: 执行安装命令STEP-6: 配置ROS环境 测试ROS 前言 ROS是Robot Operating System的缩写, 即机器人操作系统, ROS是一组软件库和工具&…