多线程中的Java死锁

用户名

我正在尝试学习Java多线程。当陷入僵局时,我真的很难理解这些概念。这是我自己理解死锁的代码。但是它编译没有错误。但是当我运行它时,它显示了一个Nullpointer异常。这是错误

堆栈跟踪:

Exception in thread "Thread-0" java.lang.NullPointerException
        at deadlockA.run(deadlock.java:70)
        at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-1" java.lang.NullPointerException
        at deadlockB.run(deadlock.java:91)
        at java.lang.Thread.run(Thread.java:745)

请帮助我清楚地了解错误。

代码:

import java.io.*;

class A {
    public synchronized void funcA(B b) {
        System.out.println("INSIDE FIRST OBJECTS MONITOR");

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            System.out.println(e);
        }
        b.last();
    }

    public synchronized void last() {
        System.out.println("INSIDE A's LAST");
    }

}

class B {
    public synchronized void funcB(A a) {
        System.out.println("INSIDE SECOND OBJECT MONITOR");

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            System.out.println(e);
        }

        a.last();
    }

    public synchronized void last() {
        System.out.println("INSIDE A's LAST");
    }

}

class deadlockA implements Runnable {
    Thread t;
    A a1;
    B b1;

    deadlockA(B b2) {
        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) {
        a2 = a3;
        t = new Thread(this);
        t.start();
    }

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

}

class deadlock {
    public static void main(String args[]) {

        A A1 = new A();
        B B1 = new B();

        deadlockA da = new deadlockA(B1);
        deadlockB db = new deadlockB(A1);

    }
}
萨加尔D

对象a1b3永远不会被初始化,因此呼吁他们的功能提供了一个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();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章