Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 并发性:完整集合或元素_Java_Concurrency - Fatal编程技术网

Java 并发性:完整集合或元素

Java 并发性:完整集合或元素,java,concurrency,Java,Concurrency,我的收藏需要每秒钟更新一次。我用于ScheduledExecutor服务。但我有一个问题,是最好给线程池提供完整的集合,还是将集合的每个元素发送到线程池 我建议以下解决方案: 对于Map集合,将其替换为ConcurrentHashMap。此map具有可容忍集合更改的迭代器,并且基于键hashCode()对其进行条带化锁定 对于Setcollections,使用工厂collections.newSetFromMap()创建的集合,并将ConcurrentHashMap实例作为参数传递。这将为您提

我的收藏需要每秒钟更新一次。我用于ScheduledExecutor服务。但我有一个问题,是最好给线程池提供完整的集合,还是将集合的每个元素发送到线程池

我建议以下解决方案:

  • 对于
    Map
    集合,将其替换为
    ConcurrentHashMap
    。此
    map
    具有可容忍集合更改的迭代器,并且基于键
    hashCode()
    对其进行条带化锁定
  • 对于
    Set
    collections,使用工厂
    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中找到我的名字。但是,在那之后,解决方案无论如何都需要发布在那里。好的……但是……找不到你。加我。