2016-04-03 3 views
0

Я создал список объектов, а также список потоков, которые переданный параметр является случайным объектом из списка. После создания потока поток должен блокировать объект, переданный в параметре. Однако, хотя я установил поток спать после его создания, чтобы сформировать тупик. Кажется, что не существует тупика. Основываясь на некоторых исследованиях google, я узнал, что объект передается по ссылке в java, но я не уверен, почему он здесь не работает.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

Что здесь происходит, у вас есть 5 экземпляров CustomThread, которые каждый получает уникальный объект, замок на ней, и идти спать. Другие 5 потоков получают объект, который уже используется, поэтому, когда их CustomThread пытается заблокировать его, они должны ждать max. 10 секунд для завершения первого потока. На этом этапе второй поток может блокировать объект, и он это делает.

Ваше использование случайных означает, что буквально первые 5 получают уникальный объект, а второй 5 - это не то, что основная идея одна и та же, вторая CustomThread просто ждет первого.

Если вы хотите создать настоящий тупик, вам понадобится первая нить, которая удерживает блокировку, чтобы что-то понадобилось из второго потока, который ждет блокировки. Он должен быть циклической зависимостью, Thread A ожидает Thread B, в то же время Thread B ждет Thread. В вашем случае у вас есть только Thread B, ожидающий Thread.

Обнаружили вопрос, который может указывать на вы, как создать тупик;

Смежные вопросы