多线程中的java死锁
我正在尝试学习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
在
死锁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。我成功地执行了这个计划。但是没有任何死锁的迹象。如果是死锁,为什么不挂起来?此程序是否清楚地或至少部分地反映了死锁。我完全糊涂了,谢尔曼。我成功地执行了这个计划。但是没有任何死锁的迹象。如果是死锁,为什么不挂起来?此程序是否清楚地或至少部分地反映了死锁。我完全糊涂了……我成功地执行了这个计划。但是没有任何死锁的迹象。如果是死锁,为什么不挂起来?此程序是否清楚地或至少部分地反映了死锁。我完全糊涂了。看看我最近发布的编辑,它展示了死锁是如何发生的。是的,现在我明白了。我成功地执行了这个程序。但是没有任何死锁的迹象。如果是死锁,为什么不挂起来?此程序是否清楚地或至少部分地反映了死锁。我完全糊涂了。看看我最近发布的编辑,它展示了死锁是如何发生的。是的,现在我明白了。我成功地执行了这个程序。但是没有任何死锁的迹象。如果是死锁,为什么不挂起来?此程序是否清楚地或至少部分地反映了死锁。我完全糊涂了。我成功地执行了这个程序。但是没有任何死锁的迹象。如果是死锁,为什么不挂起来?此程序是否清楚地或至少部分地反映了死锁。我完全糊涂了。