【问题标题】:Java Synchronized List - Single thread iteration [duplicate]Java同步列表-单线程迭代[重复]
【发布时间】:2019-10-04 08:44:04
【问题描述】:

我正在使用Collections.synchronizedList,我有多个线程构建此列表。然而,在它建成后,我只有一个线程遍历它。在这种情况下,以下内容是否仍然必不可少?

用户必须手动同步返回的 迭代时列出:

    List list = Collections.synchronizedList(new ArrayList());
    ...   
    synchronized (list) {
      Iterator i = list.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
    }

【问题讨论】:

  • 如果所有线程都完成了您的列表的构建,为什么您需要对单线程访问它进行并发控制?
  • 没有。作为额外的完整性检查/措施,您可以将其包装在 Collections.unmodifiableList 中,或者为了加快速度将数据复制到新列表(与您的关注无关)。
  • 这就是我的意思,只是证实了我的怀疑
  • 如果您可以确保在构建列表后对列表进行单线程访问,那么就无法理解为什么没有同步的迭代会成为问题。迭代器提供对备份列表的直接访问,只要确保它没有被滥用
  • 警告只是说 结构 不能真正处理由另一个线程更改的迭代器:本地迭代器的状态未更新。

标签: java


【解决方案1】:

创建列表后,如果您确定它不再需要同步,请从旧列表创建一个新的unsynchronized 列表。无需继续支付性能损失。

List< Whatever > list = new ArrayList<>( mySynchList ) ;

如果列表不再需要添加、删除或替换的元素,请将其设为不可修改。

List< Whatever > list = 
        Collections.unmodifiableList ( 
            new ArrayList<>( mySynchList ) 
        ) 
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多