//这是多线程类,当启动两个线程A,B时,调用run()方法执行以下代码:
ckage com.mxlcpu.clazz;
import java.util.Random;
public class Fan implements Runnable {
@Override
public void run() {
int i = new Random().nextInt(1);
while (true){
if (i%2 == 0){
synchronized(ClockTool.clockA){
System.out.println("if拿到clockA");
synchronized(ClockTool.clockB){
System.out.println("if拿到clockB");
}
}
i++;
}else {
synchronized(ClockTool.clockB){
System.out.println("else拿到clockB");
synchronized(ClockTool.clockA){
System.out.println("else拿到clockA");
}
}
i++;
}
}
}
}
然后控制台会输出:
if拿到clockA
if拿到clockB
else拿到clockB
if拿到clockA
可以发现虽然是while无限循环,但是只执行了一小段,控制台别不输出了,处于卡死状态,为什么呢?
从控制台结果分析:
一个线程进入到if中,并且执行了其中的代码,此时另一个线程进入到else中,拿到了同步锁clockB,然而此时另一个线程抢到了CPU,进入到if语句,拿到锁clockA,然后就是一个线程要拿已经被对方拿走的同步锁,两个线程都在等待对方释放同步锁来拿走,便产生了抱死状态.
所以在实际开发中我们要避免这样的设计.