一、实现方案
- 使用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();
}
}
}
}
public class Test {
public volatile static int count = 1;
public static void main(String[] args) throws Exception {
System.out.println("start....");
ReentrantLock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
new Thread(() -> {
while (count < 100) {
try {
lock.lock();
if (count % 3 == 1) {
System.out.println("threadA:" + count);
count++;
condition2.signal();
condition1.await();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}, "threadA").start();
new Thread(() -> {
while (count < 100) {
try {
lock.lock();
if (count % 3 == 2) {
System.out.println("threadB:" + count);
count++;
condition3.signal();
condition2.await();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}, "threadB").start();
new Thread(() -> {
while (count < 100) {
try {
lock.lock();
if (count % 3 == 0) {
System.out.println("threadC:" + count);
count++;
condition1.signal();
condition3.await();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}, "threadC").start();
}
}
三、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();
}
}
}
}