[英]Deadlock implementation doesn't work without Thread.sleep
我試圖理解死鎖並因此嘗試創建死鎖的實現。 這個想法是創建循環鎖定的模擬。 這是我的Runnable
實現:
public class WorkDelegator implements Runnable {
private static final Logger LOGGER = Logger.getGlobal();
WorkDelegator workDelegatorSupplier;
private final String name;
public WorkDelegator(String name) {
this.name = name;
}
public void setWorkDelegatorSupplier(WorkDelegator workDelegatorSupplier) {
this.workDelegatorSupplier = workDelegatorSupplier;
}
public void delegate(){
synchronized (workDelegatorSupplier) {
// try {
// Thread.sleep(300);
// } catch (InterruptedException e) {
// LOGGER.warning("InterruptedException in Task " + name);
// }
workDelegatorSupplier.delegate();
}
LOGGER.info("task delegated from " + name + "to " + workDelegatorSupplier);
}
@Override
public void run() {
LOGGER.info(this + " is trying to delegate task to " + workDelegatorSupplier);
delegate();
}
}
一堆WorkDelegator
實例通過調用delegate
void 循環委托彼此的工作。 關鍵是如果注釋掉的代碼也在執行,它可以正常工作,但是為什么我在沒有線程睡眠的情況下得到StackOverflowError
呢?
PS - 委托工廠 class:
public class WorkDelegatorFactory {
public List<WorkDelegator> getDelegatorsList(int size) {
List<WorkDelegator> workDelegatorList = new ArrayList<>();
for (int i = 0; i < size ; i++) {
workDelegatorList.add(new WorkDelegator(String.valueOf(i)));
}
WorkDelegator firstDelegator = workDelegatorList.get(0);
WorkDelegator lastDelegator = workDelegatorList.get(size-1);
lastDelegator.setWorkDelegatorSupplier(firstDelegator);
for (int i = 0; i < size-1; i++) {
workDelegatorList.get(i).setWorkDelegatorSupplier(workDelegatorList.get(i+1));
}
return workDelegatorList;
}
}
如果沒有sleep
,啟動的第一個線程可以在其他線程啟動之前進行大量遞歸調用。 這允許他們獲取足夠多的同步鎖以無限期地繼續並最終耗盡堆棧深度。 其他線程開始到達太晚,無法獲取它們的第一個同步鎖而只是閑置。
在sleep
下,每個線程只能獲取一個同步鎖,並且沒有線程可以提前到可以循環的程度。
您所看到的是並發編程的難點之一:您知道每個線程中的順序,但不知道每個線程與其他線程的關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.