java扩展线程类中的线程死锁

时间:2017-10-11 17:45:37

标签: java multithreading

在此代码中创建DeadLock d1和d2的两个对象,然后创建所有资源的单独副本,即,将为d1和d2创建r1,r2,r3,即使然后线程d1和d2在访问资源时进入死锁,这是什么任何人都可以请原因解释

import java.util.*;
class DeadLock extends Thread{
String r1="Oracle";
String r2="Sybase";
String r3="DB2";
DeadLock(String name){
    super(name);
}
public void run(){
    if(Thread.currentThread().getName().equals("Rama")){
        acquireRamaResources();
    }
    else{
        acquireSitaResources();
    }
}
void acquireRamaResources(){
    synchronized(r1){
        System.out.println("Rama acquired Oracle");
        synchronized (r2){
            System.out.println("Rama acquired Sybase");
            synchronized(r3){
                System.out.println("Rama acquired DB2");
            }
        }
    }
}
void acquireSitaResources(){
    synchronized(r3){
        System.out.println("Sita acquired DB2");
        synchronized (r2){
            System.out.println("Sita acquired Sybase");
            synchronized(r1){
                System.out.println("Sita acquired Oracle");
            }
        }
    }
  }
}

class Demo{
public static void main(String[]args){
    DeadLock d1=new DeadLock("Rama");
    DeadLock d2=new DeadLock("Sita");
    d1.start();
    d2.start();
 }
}

1 个答案:

答案 0 :(得分:0)

这是因为r1,r2和r3字段具有相同的值(相同的对象)。简而言之,当您在Java中使用文字字符串时,它们将从特殊池中获取。

如果您按以下方式更改代码

String r1=new String("Oracle");
String r2=new String("Sybase");
String r3=new String("DB2");

死锁会消失,因为该字段的值将是不同的对象(new String()调用会创建不同的对象)。

以下代码打印为true,然后为false。

    String a = "asdasdas";
    String b = "asdasdas";
    System.out.println(a == b);
    a = new String("asdasdas");
    b = new String("asdasdas");
    System.out.println(a == b);

您可能需要查看this更多信息