2017-10-11 57 views
0

在此代码中,创建了DeadLock d1和d2的两个对象,然后即使线程d1和d2进入死锁,也会为d1和d2创建所有资源的单独副本,即r1,r2,r3在访问的资源是什么原因谁能请正确Java扩展线程类中的线程死锁

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(); 
} 
} 

回答

0

这是因为R1,R2和R3领域具有相同的值(同一对象)解释它。简而言之,当您在Java中使用文字字符串时,它们将从特殊池中获取。

如果你改变你的代码通过以下方式

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

僵局将dissapear,因为该值的字段会有所不同对象(新的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脱颖而出更多信息

+0

非常感谢你回答这个问题,我是从一个星期抓我的头没有找到这个解决方案... –

+0

@VijayGKulkarni肯定的是,如果它帮助,你可以接受答案。 –