From 0faf89f006f7a888c747fff259544cd03e360b15 Mon Sep 17 00:00:00 2001
From: = <=>
Date: Sun, 16 Mar 2025 22:09:58 +0800
Subject: [PATCH] Add demo for CLH
---
src/main/java/threaddemo/lock/CLH.java | 30 ++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
create mode 100644 src/main/java/threaddemo/lock/CLH.java
diff --git a/src/main/java/threaddemo/lock/CLH.java b/src/main/java/threaddemo/lock/CLH.java
new file mode 100644
index 0000000..2e5166e
--- /dev/null
+++ b/src/main/java/threaddemo/lock/CLH.java
@@ -0,0 +1,30 @@
+package threaddemo.lock;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * demo class for CLH. code from
+ * Java AQS 核心数据结构-CLH 锁
+ * This is only for demo, do not run the code this node class is not workable
+ */
+public class CLH {
+ private final ThreadLocal node = ThreadLocal.withInitial(Node::new);
+ private final AtomicReference tail = new AtomicReference<>(new Node());
+
+ private static class Node {
+ private volatile boolean locked;
+ }
+
+ private void lock() {
+ Node node = this.node.get();
+ node.locked = true;
+ Node pre = this.tail.getAndSet(node);
+ while (!pre.locked) ;
+ }
+
+ private void unlock() {
+ final Node node = this.node.get();
+ node.locked = false;
+ this.node.set(new Node());
+ }
+}