代码
package com.gallant.test;
/**
* @author : 会灰翔的灰机
* @date : 2021/2/14
*/
public class AbcTask {
private static final int COUNT = 10;
public static void main(String[] args) throws InterruptedException {
Object a = new Object();
Object b = new Object();
Object c = new Object();
new AbcThread(a, b, "A").start();
new AbcThread(b, c, "B").start();
Thread.sleep(1);
new AbcThread(c, a, "C").start();
}
static class AbcThread extends Thread {
private final Object parent;
private final Object child;
private final String value;
public AbcThread(Object parent, Object child, String value) {
this.parent = parent;
this.child = child;
this.value = value;
}
@Override
public void run() {
for (int i = 0; i < COUNT; i++) {
synchronized (parent) {
synchronized (child) {
System.out.println(this.getName() + ":" + value);
child.notifyAll();
}
try {
parent.wait(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
输出
Thread-0:A
Thread-1:B
Thread-2:C
Thread-0:A
Thread-1:B
Thread-2:C
Thread-0:A
Thread-1:B
Thread-2:C
Thread-0:A
Thread-1:B
Thread-2:C
Thread-0:A
Thread-1:B
Thread-2:C
Thread-0:A
Thread-1:B
Thread-2:C
Thread-0:A
Thread-1:B
Thread-2:C
Thread-0:A
Thread-1:B
Thread-2:C
Thread-0:A
Thread-1:B
Thread-2:C
Thread-0:A
Thread-1:B
Thread-2:C
Process finished with exit code 0
总结
线程锁获取与释放过程
valueA线程:锁A->锁B->执行A->唤醒锁B->释放锁B->等待锁A唤醒并释放锁A
valueB线程:锁B->锁C->执行B->唤醒锁C->释放锁C->等待锁B唤醒并释放锁B
valueC线程:锁C->锁A->执行C->唤醒锁A->释放锁A->等待锁C唤醒并释放锁C