没有Thread.sleep的情况下,死锁的实现是不可能的

问题描述 投票:0回答:1

我试图理解死锁,并相应地试图创建一个死锁的实现.这个想法是创建一个循环锁的模拟。下面是我的 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();
}
}

A bunch of WorkDelegator 实例之间循环委托工作,通过调用 delegate void。关键是,如果注释出来的代码也在执行,它就能正常工作,但为什么我得到的是 StackOverflowError 没有线程睡眠?

PS - Delegator Factory类。

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;
}
}
java multithreading concurrency deadlock
1个回答
2
投票

没有 sleep 第一个启动的线程可以在其他线程启动之前进行大量的递归调用。这使得他们可以抢到足够多的同步锁,无限期地继续下去,最终用完堆栈深度。其他启动的线程到得太晚,来不及抢夺它们的第一个同步锁,只能闲置着。

有了 sleep 每个线程只能抢一个同步锁,而且没有一个线程可以领先到循环。

你看到的是并发编程的难点之一:你知道每个线程中的序列,但不知道每个线程与其他线程的关系。

© www.soinside.com 2019 - 2024. All rights reserved.