2016-04-03 93 views
0

我已經創建的對象的列表,並且還線程列表發送所述參數是從該列表中隨機對象。一旦線程被創建,線程應該鎖定在參數中傳遞的對象。但是,儘管我在創建線程後形成死鎖,但已將線程設置爲睡眠。似乎沒有形成任何僵局。基於一些谷歌的研究,我瞭解到對象是在Java中通過引用,但我不知道爲什麼它不在這裏工作。爪哇:通過對象在參數指針(通過引用傳遞)

for(int i=0;i<5;i++){ 
    Object tempObject = new Object(); 
    objectList.add(tempObject); 
} 

Random rand = new Random(); 
for(int i =0;i<5;i++){ 
    for(int j =0;j<10;j++){ 
     int random = rand.nextInt(objectList.size()); 
     CustomThread ct = new CustomThread(i,objectList.get(random)); 
     ct.start(); 
     System.out.println(); 
    } 
    try { 
     detectDeadlock(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

public static void detectDeadlock() throws InterruptedException { 
    while(true){ 
     ThreadMXBean threadBean = ManagementFactory.getThreadMXBean(); 
     long[] threadIds = threadBean.findDeadlockedThreads(); 
     int deadlockedThreads = threadIds != null? threadIds.length : 0; 
     System.out.println("Number of deadlocked threads: " + deadlockedThreads); 
     TimeUnit.MILLISECONDS.sleep(1000); 
    } 
} 

CustomThread.java

NewThread(int processID, Object tObject) { 
    this.pid = processID; 
    this.object = tObject; 
} 

@Override 
public void run() { 
    synchronized (this.object) { 
     Random rand = new Random(); 
     System.out.println("Holding an object"); 
     try { TimeUnit.MILLISECONDS.sleep(rand.nextInt(10000)); } 
     catch (InterruptedException e) {} 
    } 
} 
+0

什麼是'detectDeadlock'? –

+0

@PaulBoddington我也加了這個方法。 –

回答

1

這裏發生的事情是,你有CustomThread的5個實例,每個得到它唯一的對象,鎖定和去睡覺。其他5個線程得到一個已經在使用的對象,所以當它們的CustomThread嘗試鎖定它時,它們必須等待最大值。 10秒鐘完成第一個線程。此時第二個線程能夠鎖定對象,並且它可以。

您對Random的使用意味着它不是字面上的第5個獲得一個獨特的對象,第5個沒有,但基本的想法是相同的,第二個CustomThread只是等待第一個完成。

如果你想創建你需要持有的鎖需要從被上了鎖等待第二個線程的東西第一個線程真正的死鎖。它需要一個循環依賴,線程,線程B等待,而在同一時間線程B在線程A等待你的情況,你只有線程B等待線程A

發現其可能指向一個問題你如何創造一個僵局;