首页 > 其他分享 >通过aqs 自定义lock

通过aqs 自定义lock

时间:2023-02-27 10:13:37浏览次数:51  
标签:return aqs Thread lock sync Override public 自定义

aqs(AbstractQueuedSynchronizer),通过继承此类可以实现自定义aqs,以下为例子:

package com.work.testwork.mylock;

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 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();
    }
}
package com.work.testwork;

import com.work.testwork.mylock.LockTest;

class test_work_application_tests {
    static LockTest lock = new LockTest();

    public static void main(String[] args) {

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

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

    }

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

}

 

标签:return,aqs,Thread,lock,sync,Override,public,自定义
From: https://www.cnblogs.com/goPush/p/17158701.html

相关文章

  • Mysql 自定义目录安装
    这里教大家安装Mysql的时候自定义安装目录1、Mysql版本我这里选择的是8.0,下边有下载链接,其他的版本也行,操作都是一样的 Mysql8.0下载链接:MySQL::DownloadMySQLInsta......
  • 联邦学习论文阅读笔记11 FGFL: A blockchain-based fair incentive governor for Fede
    面对的问题:激励分配不均、攻击者欺骗 方法:提出FGFL模型。1)设计了时间衰减SLM算法度量工作者声誉;2)设计了基于梯度相似度的轻量级方法度量工作者贡献;3)提出了一种公平的激......
  • 自定义组件
                                                         ......
  • 数组与自定义函数
    一维数组    ·                  字符可以做下标吗?数组的下标必须是整数,那么字符可以做下标吗?比如:int a[255];a[......
  • AQS+CAS+lockSupport实现简单的Lock锁
    packagetech.lingjia.common.controller;importjava.util.concurrent.ConcurrentLinkedDeque;importjava.util.concurrent.atomic.AtomicInteger;importjava.util......
  • 11_10_第六阶段:大前端进阶||07-Vue详解||P12:自定义事件内容分发(this.$emit())【Vue核心
    Vue:计算属性,内容分发,【自定义事件】1.自定义事件注:涉及到的JavaScript语法2.代码流程在vue的实例中,增加了methods对象并定义了一个名为removeItems的方法varvm=newVu......
  • SpringBoot33 - 自定义starter
    自定义starter开发​ 自动配置学习完后,我们就可以基于自动配置的特性,开发springboot技术中最引以为傲的功能了,starter。其实通过前期学习,我们发现用什么技术直接导入对应......
  • 【unity】基于Playable的自定义动画系统
    前言开发时逐渐对蜘蛛网动画系统中重复性的工作感到厌烦,而且当动画一多起来,即使蜘蛛网分了层,我仍然连看都不想看。遂寻求解决方案。蜘蛛网那一套系统不支持在运行时创建......
  • MyBatis_06(自定义映射resultMap)
    主题:自定义映射resultMap"自定义映射resultMap",可以解决什么问题:1-"属性"和"字段名"不一致的情况2-"多对一"的情况3-"一对多"的情况一、若"字段名"和"......
  • set的自定义排序
    看下面的代码就好了structcmp{ booloperator()(constpair<int,int>&a,constpair<int,int>&b)const{ intlena=a.second-a.first+1; intlenb=b.second-b.firs......