多线程中的java死锁

多线程中的java死锁,java,multithreading,deadlock,Java,Multithreading,Deadlock,我正在尝试学习java多线程。说到死锁,我真的很难理解这些概念。这是我自己用来理解死锁的代码。但是它编译时没有错误。但是当我运行它时,它显示了一个空指针异常。下面是错误 堆栈跟踪: 请帮我弄清楚错误所在 代码: 在死锁a(b2)构造函数中,您不初始化a1类变量,而是在run()中使用它。对于死锁B(a3)中的b3和死锁B(b2)构造函数中的b3相同,您不初始化a1类变量,而是在run()中使用它。对于死锁b(a3)中的b3也一样,对象a1和b3从未初始化,因此对其调用函数会产生NullPoint

我正在尝试学习java多线程。说到死锁,我真的很难理解这些概念。这是我自己用来理解死锁的代码。但是它编译时没有错误。但是当我运行它时,它显示了一个空指针异常。下面是错误

堆栈跟踪: 请帮我弄清楚错误所在

代码:
死锁a(b2)
构造函数中,您不初始化
a1
类变量,而是在
run()
中使用它。对于
死锁B(a3)
中的
b3
死锁B(b2)
构造函数中的
b3
相同,您不初始化
a1
类变量,而是在
run()
中使用它。对于
死锁b(a3)
中的
b3
也一样,对象
a1
b3
从未初始化,因此对其调用函数会产生
NullPointerException
。检查以下更正的代码:

class deadlockA implements Runnable
{
  Thread t;
  A a1;
  B b1;
   deadlockA(B b2)
   {
   a1 = new A(); //Create an object
   b1=b2;
   t=new Thread(this);
   t.start();
   }

   public void run()
   {
     a1.funcA(b1);
   }

}


class deadlockB implements Runnable
{
  Thread t;
  A a2;
  B b3;

   deadlockB(A a3)
   {
     b3 = new B(); // Create an object
     a2=a3;
     t=new Thread(this);
     t.start();
   }

   public void run()
   {
     b3.funcB(a2);
   }

}

如果您想真正看到死锁场景,请考虑下面发布的代码:

public class MyDeadlock {

    String str1 = "Java";
    String str2 = "CPP";

    Thread trd1 = new Thread("My Thread 1"){
        public void run(){
            while(true){
                synchronized(str1){
                    synchronized(str2){
                        System.out.println(str1 + str2);
                    }
                }
            }
        }
    };

    Thread trd2 = new Thread("My Thread 2"){
        public void run(){
            while(true){
                synchronized(str2){
                    synchronized(str1){
                        System.out.println(str2 + str1);
                    }
                }
            }
        }
    };

    public static void main(String a[]){
        MyDeadlock mdl = new MyDeadlock();
        mdl.trd1.start();
        mdl.trd2.start();
    }
}

对象
a1
b3
从未初始化,因此对它们调用函数会产生
NullPointerException
。检查以下更正的代码:

class deadlockA implements Runnable
{
  Thread t;
  A a1;
  B b1;
   deadlockA(B b2)
   {
   a1 = new A(); //Create an object
   b1=b2;
   t=new Thread(this);
   t.start();
   }

   public void run()
   {
     a1.funcA(b1);
   }

}


class deadlockB implements Runnable
{
  Thread t;
  A a2;
  B b3;

   deadlockB(A a3)
   {
     b3 = new B(); // Create an object
     a2=a3;
     t=new Thread(this);
     t.start();
   }

   public void run()
   {
     b3.funcB(a2);
   }

}

如果您想真正看到死锁场景,请考虑下面发布的代码:

public class MyDeadlock {

    String str1 = "Java";
    String str2 = "CPP";

    Thread trd1 = new Thread("My Thread 1"){
        public void run(){
            while(true){
                synchronized(str1){
                    synchronized(str2){
                        System.out.println(str1 + str2);
                    }
                }
            }
        }
    };

    Thread trd2 = new Thread("My Thread 2"){
        public void run(){
            while(true){
                synchronized(str2){
                    synchronized(str1){
                        System.out.println(str2 + str1);
                    }
                }
            }
        }
    };

    public static void main(String a[]){
        MyDeadlock mdl = new MyDeadlock();
        mdl.trd1.start();
        mdl.trd2.start();
    }
}

您的
死锁类
未初始化
a1
。这就是为什么程序抛出
NullPointerException
。在堆栈跟踪中有:

Exception in thread "Thread-0" java.lang.NullPointerException //what was thrown
at deadlockA.run(deadlockz.java:70) //where it was throw - method 'run' of class 'deadlockA', line 70 of a file where you have deadlockA defined.
你有问题的课堂评论:

class deadlockA implements Runnable
{
    Thread t;
    A a1; //not initialized.
    B b1;

    deadlockA(B b2)
    {
        b1=b2;
        t=new Thread(this);
        t.start();
    }

    public void run()
    {
        a1.funcA(b1); //a1 object is null.
    } 
}

您的
死锁类
未初始化
a1
。这就是为什么程序抛出
NullPointerException
。在堆栈跟踪中有:

Exception in thread "Thread-0" java.lang.NullPointerException //what was thrown
at deadlockA.run(deadlockz.java:70) //where it was throw - method 'run' of class 'deadlockA', line 70 of a file where you have deadlockA defined.
你有问题的课堂评论:

class deadlockA implements Runnable
{
    Thread t;
    A a1; //not initialized.
    B b1;

    deadlockA(B b2)
    {
        b1=b2;
        t=new Thread(this);
        t.start();
    }

    public void run()
    {
        a1.funcA(b1); //a1 object is null.
    } 
}

变量a1和b3未在任何地方初始化,这会导致NullPointerException。顺便说一句,您发布的堆栈跟踪与您发布的代码无关

下面的代码将帮助您更好地理解死锁情况。 有两个对象,thread1获取object1上的锁,thread2获取object2上的锁,5秒后thread1尝试获取由thread2持有的object2上的锁,thread2尝试获取由thread1持有的object1上的锁,这是循环依赖项(死锁)。希望这有帮助

final Object object1 = new Object();

final Object object2 = new Object();

Thread thread1 = new Thread() {
    public void run() {
    synchronized (object1) {
        try {
        Thread.sleep(5 * 1000);
        synchronized (object2) {
            System.out.println("I am here");
        }
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
    }
    }
};

Thread thread2 = new Thread() {
    public void run() {
    synchronized (object2) {
        try {
        Thread.sleep(5 * 1000);
        synchronized (object1) {
            System.out.println("I am here");
        }
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
    }
    }
};

thread1.start();
thread2.start();

变量a1和b3未在任何地方初始化,这会导致NullPointerException。顺便说一句,您发布的堆栈跟踪与您发布的代码无关

下面的代码将帮助您更好地理解死锁情况。 有两个对象,thread1获取object1上的锁,thread2获取object2上的锁,5秒后thread1尝试获取由thread2持有的object2上的锁,thread2尝试获取由thread1持有的object1上的锁,这是循环依赖项(死锁)。希望这有帮助

final Object object1 = new Object();

final Object object2 = new Object();

Thread thread1 = new Thread() {
    public void run() {
    synchronized (object1) {
        try {
        Thread.sleep(5 * 1000);
        synchronized (object2) {
            System.out.println("I am here");
        }
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
    }
    }
};

Thread thread2 = new Thread() {
    public void run() {
    synchronized (object2) {
        try {
        Thread.sleep(5 * 1000);
        synchronized (object1) {
            System.out.println("I am here");
        }
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
    }
    }
};

thread1.start();
thread2.start();


我可以知道为什么你认为它不相关吗?堆栈跟踪显示deadlockz.java,但是在你发布的代码中没有这样的类名(在deadlockA.run(deadlockz.java:70))存在main的类不是
public
,因此文件名可以是任何东西。@LoganathanMohanraj。是的,那是我的错。更正了。@LoganathanMohanraj。如果代码完全是死锁,那么它为什么不挂起。?我可以知道为什么您认为它不相关吗?堆栈跟踪显示deadlockz.java,但您发布的代码中没有此类类名(位于deadlockA.run(deadlockz.java:70))存在main的类不是
public
,因此文件名可以是任何内容。@LoganathanMohanraj。是的,那是我的错。更正了。@LoganathanMohanraj。如果代码完全是死锁,那么为什么它不挂起。?Schielmann。我成功地执行了这个计划。但是没有任何死锁的迹象。如果是死锁,为什么不挂起来?此程序是否清楚地或至少部分地反映了死锁。我完全糊涂了,谢尔曼。我成功地执行了这个计划。但是没有任何死锁的迹象。如果是死锁,为什么不挂起来?此程序是否清楚地或至少部分地反映了死锁。我完全糊涂了……我成功地执行了这个计划。但是没有任何死锁的迹象。如果是死锁,为什么不挂起来?此程序是否清楚地或至少部分地反映了死锁。我完全糊涂了。看看我最近发布的编辑,它展示了死锁是如何发生的。是的,现在我明白了。我成功地执行了这个程序。但是没有任何死锁的迹象。如果是死锁,为什么不挂起来?此程序是否清楚地或至少部分地反映了死锁。我完全糊涂了。看看我最近发布的编辑,它展示了死锁是如何发生的。是的,现在我明白了。我成功地执行了这个程序。但是没有任何死锁的迹象。如果是死锁,为什么不挂起来?此程序是否清楚地或至少部分地反映了死锁。我完全糊涂了。我成功地执行了这个程序。但是没有任何死锁的迹象。如果是死锁,为什么不挂起来?此程序是否清楚地或至少部分地反映了死锁。我完全糊涂了。