三个线程循环打印ABC多次,要求同时开启多个线程
核心思路:三个线程分别打印A,B,C;一个执行完后唤醒另外一个线程。主要使用Object.wait()
和Object.notify()
这两个方法。
实现方法
- A->B, B->C,C->A之间状态的转换分别使用不同的对象锁
- 不同状态之间的转换使用同一个状态锁,完成后使用notifyAll,并在自己的线程中检查,是否满足执行条件,不满足则继续wait。
代码实现
- 使用不同的对象锁
这种方法其实是有问题的,由于嵌套的同步对象,存在死锁的风险,在两个的时候就比较容易提现出来。3个线程就不太容易复现,因为要3个线程同时进入Thread.yeild()
那段代码,然后同时唤醒,都想要获取next的监视器锁,但是都获取不到。
public class CrycleThreader {
private void test() {
LockHolder A = new LockHolder();
LockHolder B = new LockHolder();
LockHolder C = new LockHolder();
A.setReady(true);
CycleClass cycleA = new CycleClass(A, B, "A", 10);
CycleClass cycleB = new CycleClass(B, A, "B", 10);
// CycleClass cycleC = new CycleClass(C, A, "C", 10);
cycleA.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
cycleB.start();
// cycleC.start();
}
public static void