[英]Thread deadlock in java extending thread class
在此代码中,创建了两个死锁对象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();
}
}
这是因为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);
您可能要检查这个脱颖而出的详细信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.