手写实现简单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;
}
}
posted @   chendsome  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示