diff --git a/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/ReentrantLockTest.java b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/ReentrantLockTest.java new file mode 100644 index 0000000000000000000000000000000000000000..a95e1028ad142ca8834ad1d5ade1ae303b0b7d1c --- /dev/null +++ b/whatsmars-common/src/test/java/org/hongxi/java/util/concurrent/ReentrantLockTest.java @@ -0,0 +1,98 @@ +package org.hongxi.java.util.concurrent; + +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class ReentrantLockTest { + + public static void main(String[] args) { + + final Business business = new Business(); + new Thread(() -> { + for (int i = 1; i <= 50; i++) { + business.sub2(i); + } + }).start(); + + new Thread(() -> { + for (int i = 1; i <= 50; i++) { + business.sub3(i); + } + }).start(); + + for (int i = 1; i <= 50; i++) { + business.main(i); + } + + } + + static class Business { + Lock lock = new ReentrantLock(); + Condition condition1 = lock.newCondition(); + Condition condition2 = lock.newCondition(); + Condition condition3 = lock.newCondition(); + private int shouldSub = 1; + + public void sub2(int i) { + lock.lock(); + try { + while (shouldSub != 2) { + try { + condition2.await(); + } catch (Exception e) { + e.printStackTrace(); + } + } + for (int j = 1; j <= 10; j++) { + System.out.println("sub2 thread sequence of " + j + ",loop of " + i); + } + shouldSub = 3; + condition3.signal(); + } finally { + lock.unlock(); + } + } + + public void sub3(int i) { + lock.lock(); + try { + while (shouldSub != 3) { + try { + condition3.await(); + } catch (Exception e) { + e.printStackTrace(); + } + } + for (int j = 1; j <= 20; j++) { + System.out.println("sub3 thread sequence of " + j + ",loop of " + i); + } + shouldSub = 1; + condition1.signal(); + } finally { + lock.unlock(); + } + } + + public void main(int i) { + lock.lock(); + try { + while (shouldSub != 1) { + try { + condition1.await(); + } catch (Exception e) { + e.printStackTrace(); + } + } + for (int j = 1; j <= 100; j++) { + System.out.println("main thread sequence of " + j + ",loop of " + i); + } + shouldSub = 2; + condition2.signal(); + } finally { + lock.unlock(); + } + } + + } +}