簡體   English   中英

Java擴展線程類中的線程死鎖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM