首页 > 其他分享 >手写Semaphore信号量

手写Semaphore信号量

时间:2024-07-25 14:08:23浏览次数:5  
标签:aqs MySemaphore int newState sync 信号量 Semaphore 手写 public

public class MySemaphore {
    private Sync sync;

    public MySemaphore(int count) {
        sync = new Sync(count);
    }

    public void acquire() {
        sync.acquireShared(1);
    }

    public void release() {
        sync.releaseShared(1);
    }

    class Sync extends AbstractQueuedSynchronizer {


        public Sync(int count) {
            setState(count);
        }

        @Override
        protected int tryAcquireShared(int arg) {
            for (; ; ) {
                int oldState = getState();
                int newState = oldState - arg;
                if (compareAndSetState(oldState, newState)) {
                    return newState < 0 ? -1 : 1;
                }
            }

        }

        @Override
        protected boolean tryReleaseShared(int arg) {
            // true false什么时候返回true和false newState>0 true <0
            for (; ; ) {
                int oldState = getState();
                //+1
                int newState = oldState + arg;
                if (newState < oldState) {
                    throw new Error("Maximum permit count exceeded");
                }
                if (compareAndSetState(oldState, newState)) {
                   //这里这两种写法都一样
                    return true;
                    //return newState>0;
                }

            }

        }
    }

    public static void main(String[] args) {
        // 设置aqs状态为3 只能限制有3线程执行代码  限流 做多可以容量3个人
        MySemaphore semaphore = new MySemaphore(3);
        for (int i = 1; i <= 10; i++) {
            new Thread(() -> {
                // aqs状态会减去1 如果状态=0的情况下
                semaphore.acquire();
                System.out.println(Thread.currentThread().getName() + ",进入成功");
                // aqs 状态+1 同时唤醒aqs正在阻塞的线程
                semaphore.release();
            }).start();

        }
    }


}

 

标签:aqs,MySemaphore,int,newState,sync,信号量,Semaphore,手写,public
From: https://www.cnblogs.com/shanheyongmu/p/18322901

相关文章

  • netty应用-手写RPC
    文章目录手写RPC之案例定位与通信过程介绍RPC框架案例定位服务端与客户端架构通信过程1.服务注册与发现2.请求序列化与传输3.请求处理与响应4.响应反序列化与结果处理实现细节1.服务端2.客户端技术选型关键挑战总结手写RPC之请求响......
  • 在Python多处理中执行二进制信号量或互斥体以进行上下文切换操作
    我正在尝试自动化win应用程序和java应用程序之间的同步关系。我的标准是:启动win和jav应用程序在jav应用程序中执行命令等待jav应用程序的响应使用jav应用程序的响应到Windows应用程序作为输入。在jav应用程序中执行命令win应用程序......
  • linux 信号量sem 使用示例
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、信号量是什么?二、代码示例1.posix2.systemV总结前言提示:这里可以添加本文要记录的大概内容:信号量主要用于进程间使用信号量:分为posix和systemV信号量posix信号量:sem_open:......
  • 手写操作系统:一切从主引导扇区开始
    项目简介本项目将从零实现一个基于x8632位的操作系统,系统支持多进程的运行,虚拟内存,进程与进程之间隔离,文件系统。开发语言:汇编语言与C语言,主要是C语言。开发工具:gcc编译器,gdb调试器,qemu虚拟机,dd工具,CMake.........开发环境:windows11操作系统,VScode编辑器。计算机启动......
  • 手写Kd树(C++模板非递归实现)
    手写Kd树(C++模板非递归实现)1.Kd树1.1Kd树简介1.2Kd树的建立1.3Kd树的查找2.C++完整代码实现3.测试代码3.1代码实现3.2测试结果4.与PCL中的Kd树做对比本文实现的Kd树实现参考了高翔博士的书《自动驾驶与机器人中的slam技术从理论到实践》;高博士原书中是递归......
  • 卷积神经网络CNN实战:MINST手写数字识别——数据集下载与网络训练
    数据集下载这一部分比较简单,就不过多赘述了,把代码粘贴到自己的项目文件里,运行一下就可以下载了。fromtorchvisionimportdatasets,transforms#定义数据转换,将数据转换为张量并进行标准化transform=transforms.Compose([transforms.ToTensor(),#转换为张量......
  • ValueError:信号量或锁释放次数过多?
    当我尝试在Cygwin中执行操作时,我会得到ValueError:semaphoreorlockreleasedtoomanytimes我该怎么办?pipinstallmatplotlib更新:UPDATE:$pipinstallmatplotlibDownloading/unpackingmatplotlibYouareinstallinganexternallyhosted......
  • 用 300 行代码手写提炼 Spring 核心原理 [2]
    系列文章用300行代码手写提炼Spring核心原理[1]用300行代码手写提炼Spring核心原理[2]上文中我们实现了mini-spring的1.0版本,接下来我们在此基础上进行优化,将init()方法中的代码进行封装。按照之前的思路,先搭建基础框架,再“填肉注血”。初始化阶段in......
  • 用 300 行代码手写提炼 Spring 核心原理 [1]
    手写一个mini版本的Spring框架是一个很好的实践项目,可以让你对框架的核心概念和实现有更深刻的理解。接下来我们从0-1逐层深入,一步一步揭开Spring的神秘面纱。自定义配置配置application.properties为了解析方便,我们用application.properties来代替application.......
  • 用 300 行代码手写提炼 Spring 核心原理 [1]
    手写一个mini版本的Spring框架是一个很好的实践项目,可以让你对框架的核心概念和实现有更深刻的理解。接下来我们从0-1逐层深入,一步一步揭开Spring的神秘面纱。自定义配置配置application.properties为了解析方便,我们用application.properties来代替application.......