我有以下类:
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!");
})
}
}
}
类代理由许多并发调用推送方法的线程使用。虽然,我有一个单线程执行器,并且列表存储设备只是红色的,但我得到非法状态异常("不止一个!"(,表明执行器同时执行多个任务。
有人可以解释一下这里发生了什么以及如何在这种情况下实现线程安全吗?
你有一个List<StorageDevice>
.每个元素都有自己的ExecutorService
,每个ExecutorService
执行一个线程。
因此,您有多个线程(列表中的每个元素一个(,并且所有线程同时递增和减少同一标志。