我有以下课程:
class Broker {
private final List<StorageDevice> storageDevices = new ArrayList<>();
private AtomicInteger flag = new AtomicInteger(0);
//storageDevices initialization omitted
public void push(Item item, int id) {
storageDevices.get(id).submit(item);
}
class StorageDevice{
ExecutorService executor = Executors.newSingleThreadExecutor();
void submit(Item item){
executor.execute(() -> {
if(flag.incrementAndGet()>1)
throw new IllegalStateException("More than one!");
//some additional work
if(flag.decrementAndGet()>0)
throw new IllegalStateException("More than zero!");
})
}
}
}
Class Broker 由许多同时调用 push 方法的线程使用。虽然,我有一个线程执行程序,而 List storageDevices 只是红色,但我得到 IllegalStateException(&#34;不止一个!&#34;)表示< strong> executor 正在同时执行多个任务。
有人可以解释一下这里发生了什么以及如何在这种情况下实现线程安全吗?
答案 0 :(得分:0)
你有List<StorageDevice>
。每个元素都有自己的ExecutorService
,每个ExecutorService
执行一个线程。
所以你有多个线程(列表中每个元素一个),并且所有线程同时递增和递减相同的标志。