手写实现简单AQS
手写简单的AQS
参考,推荐学习 B站up:学java的基尔兽
package org.example.aqs; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.LockSupport; public class MyLock { AtomicBoolean flag = new AtomicBoolean(false); Thread owner = null; AtomicReference<Node> head = new AtomicReference<>(new Node()); AtomicReference<Node> tail = new AtomicReference<>(head.get()); void lock(){ if(flag.compareAndSet(false, true)){ owner = Thread.currentThread(); return; } Node current = new Node(); current.thread = Thread.currentThread(); while (true){ Node currentTail = tail.get(); if (tail.compareAndSet(currentTail, current)) { current.pre = currentTail; currentTail.next = current; break; } } while (true){ // head --> A --> B --> C // 加入到尾节点后,先判断一下能否拿到锁,再park // 不然可能出现没有人再唤醒的情况 if(current.pre == head.get() && flag.compareAndSet(false, true)){ owner = Thread.currentThread(); head.set(current); current.pre.next = null; current.pre = null; return; } LockSupport.park(); } } void unlock(){ if(this.owner != Thread.currentThread()){ throw new IllegalStateException("The thread is not owned by this lock"); } // head --> A Node headNode = head.get(); Node next = headNode.next; flag.set(false); // 锁释放了 if(next != null) { LockSupport.unpark(next.thread); } } class Node{ Node pre; Node next; Thread thread; } }
本文来自博客园,作者:chendsome,转载请注明原文链接:https://www.cnblogs.com/chendsome/p/18718456
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)