我正在尝试找到一个或多个并发集合来使用,我可以实现以下行为(名称是出于类比目的而设计的): * Acts as a broker for a concurrent hash map that另一个更隐蔽的问题是,我似乎无法想到如何在不阻塞同步的情况下实现ship() --当调用ship()时,LoadingDock需要将所有新调用定向到新映射,并且在确定所有并发写入都已完成之前,不能返回旧映射(否则,我将只使用AtomicReference来保存并发映射。)
有没有一种不需要同步就能做到这一点的方法?
在线程When immutable collections are preferable then concurrent中,声明不可变的集合可能会更慢,但它们可以节省内存。如果每个不可变集合的改变都会导致创建新的对象,这怎么可能呢? 我知道并发收集指的是一个对象,它使用同步原语。那么,不可变集合如何比并发集合节省更多的内存呢?
而且,如果我没记错的话,使用Collection.synchronizedMap()或ConcurrentHashMap只能解决方法级别的并发问题。也就是说,方法将以原子方式执行。这些都没有说明方法之间的交互方式,因此即使使用并发解决方案,也可能发生以下情况。
但是,ConcurrentHashMap确实有putIfAbsent方法。这样做的缺点是,每次请求集合时,语句map.putIfAbsent(key, new Set<V>())都会创建一个新的集合。这似乎有很大的开销。对于iterateObjectsI