LeoMason
  • VIP视频
  • 微博
  • 脸书
  • 推特
  • 关于

java多线程同步机制嵌套使用产生异常的实验和分析

java多线程同步机制嵌套使用产生异常的实验和分析

先看代码

//这是多线程类,当启动两个线程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,然后就是一个线程要拿已经被对方拿走的同步锁,两个线程都在等待对方释放同步锁来拿走,便产生了抱死状态.
所以在实际开发中我们要避免这样的设计.