Java 并发性:完整集合或元素
我的收藏需要每秒钟更新一次。我用于ScheduledExecutor服务。但我有一个问题,是最好给线程池提供完整的集合,还是将集合的每个元素发送到线程池 我建议以下解决方案:Java 并发性:完整集合或元素,java,concurrency,Java,Concurrency,我的收藏需要每秒钟更新一次。我用于ScheduledExecutor服务。但我有一个问题,是最好给线程池提供完整的集合,还是将集合的每个元素发送到线程池 我建议以下解决方案: 对于Map集合,将其替换为ConcurrentHashMap。此map具有可容忍集合更改的迭代器,并且基于键hashCode()对其进行条带化锁定 对于Setcollections,使用工厂collections.newSetFromMap()创建的集合,并将ConcurrentHashMap实例作为参数传递。这将为您提
- 对于
集合,将其替换为Map
。此ConcurrentHashMap
具有可容忍集合更改的迭代器,并且基于键map
对其进行条带化锁定hashCode()
- 对于
collections,使用工厂Set
创建的集合,并将collections.newSetFromMap()
实例作为参数传递。这将为您提供ConcurrentHashMap
,其线程安全相关属性与上面提到的set
相同map
< > > <代码>列表< /代码>集合,首先考虑是否真的需要<代码>列表< /代码>。如果是,请考虑使用<代码> CopyOnWorksRayList或使用包装原始列表。
List List=Collections.synchronizedList(新的ArrayList())//或者LinkedList,但这与问题无关
ConcurrentModificationException
现在,您可能会遇到问题-Set
由工厂返回,其中不能有相同的值。如果这是您的问题,请尝试使用番石榴Multiset
。关于它的更多信息可以找到
好的,我们完成了收集工作。现在,让我们考虑一下在代码< > CurrSaleStuppMult的例子中的更新。
此结构的实现为您提供了所谓的最终可见性保证。这意味着每个迭代器代表某个集合状态—可能不是最后一个,但状态保证在某个时刻(可能在过去)是有效的。通常在大多数情况下,这就足够了
这意味着要并行处理某些活动,您可以将对该集合的引用传递给修改它的线程
或可运行
,以及读取它的其他线程
或可运行
,您应该不会有问题
请注意,上面提到的
列表
的吞吐量将更低,因为由于该包装器添加了已同步的
块,所以只能访问此集合。这将取决于手头的任务。如果你提供问题的更多细节,你会得到更准确的答案。典型的模式是提供所有引用集合的线程,但正如Luiggi在上面所写的,需要一些细节来提供更多有争议的陈述和建议。@alexey malev我们可以私下谈谈(skype/vk/email)吗?对我来说,最好是谈论我们的母语lang.@eNsirius,我们可以,但我想不迟于明天晚上,因为我要去旅行。你可以在vk和PM中找到我的名字。但是,在那之后,解决方案无论如何都需要发布在那里。好的……但是……找不到你。加我。