diff --git a/src/main/java/threaddemo/lock/CLH.java b/src/main/java/threaddemo/lock/CLH.java index 2e5166e..0d3c0f0 100644 --- a/src/main/java/threaddemo/lock/CLH.java +++ b/src/main/java/threaddemo/lock/CLH.java @@ -5,7 +5,6 @@ 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); @@ -15,14 +14,14 @@ public class CLH { private volatile boolean locked; } - private void lock() { + public void lock() { Node node = this.node.get(); node.locked = true; Node pre = this.tail.getAndSet(node); - while (!pre.locked) ; + while (pre.locked) ; } - private void unlock() { + public void unlock() { final Node node = this.node.get(); node.locked = false; this.node.set(new Node()); diff --git a/src/main/java/threaddemo/lock/CLHDemo.java b/src/main/java/threaddemo/lock/CLHDemo.java new file mode 100644 index 0000000..d258fd4 --- /dev/null +++ b/src/main/java/threaddemo/lock/CLHDemo.java @@ -0,0 +1,36 @@ +package threaddemo.lock; + +public class CLHDemo { + + public static void main(String[] args) throws InterruptedException { + CLH clh = new CLH(); + Thread t1 = new Thread(() -> { + System.out.println("t1 start"); + clh.lock(); + try { + System.out.println("t1 get lock"); + Thread.sleep(1000L); + System.out.println("t1 release lock"); + clh.unlock(); + System.out.println("t1 end"); + } catch (InterruptedException e) { + throw new RuntimeException("interrupted"); + } + }); + t1.start(); + Thread.sleep(10L); + + Thread t2 = new Thread(() -> { + System.out.println("t2 start"); + clh.lock(); + System.out.println("t2 get lock"); + clh.unlock(); + System.out.println("t2 release lock"); + System.out.println("t2 end"); + }); + t2.start(); + t1.join(); + t2.join(); + System.out.println("main end"); + } +}