加深对AQS原理的理解示例二:自己设计一个同步工具,同一时刻最多只有两个线程能访问,超过线程将被阻塞
/** *@Desc 设计一个同步工具,同一时刻最多只有两个线程能访问,超过线程将被阻塞<br> * 思路分析: * 1.共享锁 两个线程及以内能成功获取到锁 * 2. *@Author zhangfengshi *@Date 2021/4/5 3:26 下午 *@Version 1.0 */ public class TwinsLock implements Lock { public Sync sync=new Sync(2); public static class Sync extends AbstractQueuedSynchronizer { public Sync(int count){ if(count<=0){ throw new RuntimeException("error"); } setState(count); } /** * * @param reduceCount * @return -1获取共享锁失败 0-只能成功一次 后续将获取失败 正数-可以获取锁 */ @Override protected int tryAcquireShared(int reduceCount) { for(;;){ int currentCount=this.getState(); int newCount=currentCount-reduceCount; //newCount<0代表currentCount=0 if(newCount<0||compareAndSetState(currentCount,newCount)){ return newCount; } } } @Override protected boolean tryReleaseShared(int returnCount) { for(;;){ int currentCount=this.getState(); int newCount=currentCount+returnCount; if(compareAndSetState(currentCount,newCount)){ return true; } } } } @Override public void lock() { sync.acquireShared(1); } @Override public void unlock() { sync.releaseShared(1); } @Override public void lockInterruptibly() throws InterruptedException { } @Override public boolean tryLock() { int result= sync.tryAcquireShared(1); return result>0; } @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { return false; } @Override public Condition newCondition() { return null; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?