SingleThreadExecutor 是否保证线程安全?
Does SingleThreadExecutor guarantee thread safety?
我有一个关注class:
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("More than one!") 表明 executor 正在同时执行多个任务。
有人可以解释一下这里发生了什么以及在这种情况下如何实现线程安全吗?
你有一个List<StorageDevice>
。每个元素都有自己的 ExecutorService
,每个 ExecutorService
执行一个线程。
所以你有多个线程(每个列表元素一个),并且所有线程都同时递增和递减相同的标志。
我有一个关注class:
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("More than one!") 表明 executor 正在同时执行多个任务。
有人可以解释一下这里发生了什么以及在这种情况下如何实现线程安全吗?
你有一个List<StorageDevice>
。每个元素都有自己的 ExecutorService
,每个 ExecutorService
执行一个线程。
所以你有多个线程(每个列表元素一个),并且所有线程都同时递增和递减相同的标志。