一、实现方案
- 使用ReentrantLock
- synchronized同步锁
二、ReentrantLock实现
public class Test {private static int maxCount = 100;private static volatile int num = 1;private static Lock lock = new ReentrantLock();private static Condition oddCondition = lock.newCondition();private static Condition evenCondition = lock.newCondition();public static void main(String[] args) {Thread oddThread = new Thread(() -> {printOdd();}, "OddThread");Thread evenThread = new Thread(() -> {printEven();}, "EvenThread");oddThread.start();evenThread.start();}private static void printOdd() {while (num <= maxCount) {try {lock.lock();if (num % 2 != 0) {System.out.println("printOdd " + num);num++;}evenCondition.signal();oddCondition.await();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}}private static void printEven() {while (num <= maxCount) {try {lock.lock();if (num % 2 == 0) {System.out.println("printEven " + num);num++;}oddCondition.signal();evenCondition.await();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}}
}
三、synchronized同步锁
public class Test {private static int maxCount = 100;private static int num = 1;private static Object lock = new Object();public static void main(String[] args) {Thread oddThread = new Thread(() -> {printOdd();}, "OddThread");Thread evenThread = new Thread(() -> {printEven();}, "EvenThread");oddThread.start();evenThread.start();}private static void printOdd() {while (num <= maxCount) {try {synchronized (lock) {if (num % 2 != 0) {System.out.println("printOdd " + num);num++;lock.notify();lock.wait();}}} catch (InterruptedException e) {e.printStackTrace();}}}private static void printEven() {while (num <= maxCount) {try {synchronized (lock) {if (num % 2 == 0) {System.out.println("printEven " + num);num++;lock.notify();lock.wait();}}} catch (InterruptedException e) {e.printStackTrace();}}}
}