我正在尝试学习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);
}
}
对象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();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句