首页 > 其他分享 >自定义AQS

自定义AQS

时间:2023-03-14 13:56:41浏览次数:41  
标签:return AQS Thread sync Override new public 自定义

package com.demo.work.test;



import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

public class LockTest implements Lock {
    static LockTest lock = new LockTest();

    public static void test1(String[] args) {

        // 线程名称符合
        Thread thread1 = new Thread(LockTest::testLock);// 开启线程
        thread1.setName("my-aqssdsd2");
        thread1.start();

        // 线程名称不符合
        Thread thread2 = new Thread(LockTest::testLock);// 开启线程
        thread2.setName("one");
        thread2.start();

    }

    public static void testLock() {
        lock.lock();
        //重写方法
        try {
            System.out.println("我获取到了锁" + Thread.currentThread().getName());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    static class Sync extends AbstractQueuedSynchronizer {
        @Override
        protected boolean tryAcquire(int i) {
            if (!Thread.currentThread().getName().startsWith("my-aqs")) {
                return false;
            }
            Thread var2 = Thread.currentThread();
            int var3 = this.getState();
            if (var3 == 0) {
                if (this.compareAndSetState(0, i)) {
                    this.setExclusiveOwnerThread(var2);
                    return true;
                }
            } else if (var2 == this.getExclusiveOwnerThread()) {
                int var4 = var3 + i;
                if (var4 < 0) {
                    throw new Error("Maximum lock count exceeded");
                }

                this.setState(var4);
                return true;
            }

            return false;
        }

        @Override
        protected boolean tryRelease(int i) {
            int var2 = this.getState() - i;
            if (Thread.currentThread() != this.getExclusiveOwnerThread()) {
                throw new IllegalMonitorStateException();
            } else {
                boolean var3 = false;
                if (var2 == 0) {
                    var3 = true;
                    this.setExclusiveOwnerThread((Thread) null);
                }

                this.setState(var2);
                return var3;
            }
        }

        Condition getCondition() {
            return new ConditionObject();
        }
    }

    Sync sync = new Sync();

    @Override
    public void lock() {
        sync.acquire(1);
    }

    @Override
    public void lockInterruptibly() throws InterruptedException {
        sync.acquireInterruptibly(1);
    }

    @Override
    public boolean tryLock() {
        return sync.tryAcquire(1);
    }

    @Override
    public boolean tryLock(long l, TimeUnit timeUnit) throws InterruptedException {
        return sync.tryAcquireNanos(1, timeUnit.toNanos(l));
    }

    @Override
    public void unlock() {
        sync.release(1);
    }

    @Override
    public Condition newCondition() {
        return sync.getCondition();
    }
}

 以上,通过aqs类中的模板,我们可以快速定义自己的锁。如上,我需要自定义非公平锁,只需要重写tryAcquire和tryRelease方法即可,其他可以直接调用aqs内实现方法,如需自定义其他可以根据需求自行修改

标签:return,AQS,Thread,sync,Override,new,public,自定义
From: https://www.cnblogs.com/goPush/p/17214681.html

相关文章

  • 14.AQS的前世,从1990年的论文说起
    大家好,我是王有志。关注王有志,一起聊技术,聊游戏,聊在外漂泊的生活。鸽了这么久怪不好意思的,因此送一本《多处理器编程的艺术》,快点击此处参加吧。另外欢迎大家加入“共同......
  • 自定义DLL显示模式对话框时,控制台显示no message line prompt for id 0xe001的问题。
    在主工程中的资源包里默认为定义应用程序状态栏的准备就绪消息键:#defineAFX_IDS_IDLEMESSAGE0xE001此键在资源包中StringTable中会有对应的文本比如:就绪二字,版权:不......
  • WPF 自定义风扇
    成品效果如下: 制作方法:1.添加UserControl,其详细代码如下:<UserControlx:Class="WpfControl.UserControls.NFan"xmlns="http://schemas.microsoft.com......
  • 文献管理EndNote软件自定义修改引文输出格式的方法
      本文对EndNote软件修改论文参考文献引用格式的界面与各选项参数加以详细介绍。  利用EndNote软件进行论文参考文献的插入可以说是非常方便;但其亦具有一个问题,就是对......
  • java中的注解、自定义注解
    注解注解概述​ 注解类似于一个商品标签,给当前程序的开发者提供信息和标记,给java编译程序员或者jvm提供数据支持和标记,有着代码量少,易读性更高的好处,本质还是一个特殊的......
  • 自定义转换
    显示转换:staticexplicitoperator隐式转换:staticimplicitoperatorinternalclassProgram{staticvoidMain(string[]args){//......
  • qt自定义槽函数
    自定义一个类:如果你想在QLabel中使用自定义的槽函数,可以按照以下步骤进行操作:创建一个类,例如MyLabel,继承自QLabel。在MyLabel类中声明一个槽函数,例如mySlo......
  • js技术之“自定义包含方案”
    调用//用于判断包含functiondiaoyong(arr,str){//初始化varsizes=['L','XL','S','M'];for(vari=0;i<sizes.length;i++){vars......
  • echarts自定义legend图例
    本次使用vue3、echarts版本使用5.4.1:执行命令:[email protected],即可安装utils文件夹下定义echarts.ts,按需引入main.ts引入utils中定义的echarts.tsimporte......
  • 详解AQS的7个同步组件
    摘要:AQS的全称为AbstractQueuedSynchronizer,是在J.U.C(java.util.concurrent)下子包中的类。本文分享自华为云社区《【高并发】AQS案例详解》,作者:冰河。AQS的全称为Abs......