【问题标题】:Readonly objects and multithreading只读对象和多线程
【发布时间】:2016-10-03 11:14:29
【问题描述】:

在使用这个很棒的页面的问题和答案超过 2 年之后,我决定加入社区!

现在我的问题:

前几天我和一个朋友讨论过:我们认为,只读或仅由线程读取的变量不需要锁或其他任何东西来确保读取正确的值。但是其他对象,比如数组列表、哈希图呢?我是否确定地知道,多个线程可以一次使用任何对象的值而不会出现问题?

如果我问错了方式或在我的思考过程中遗漏了一些明显的东西(仍在考虑原子性......),请不要对我太苛刻。我很感激任何答案:)

【问题讨论】:

  • 这样的变量应该被声明为final,然后是的,它是线程安全的。

标签: java multithreading locking final readonly


【解决方案1】:

如果Map / List 的构造是线程安全的,并且如果ArrayListHashMap 在构造后未更改,那么是的,您的线程将能够正确读取数据。如果添加了新数据或修改了现有数据,那么如果没有适当的同步,则无法保证其他线程可以看到新的更改。

【讨论】:

    【解决方案2】:

    您的自定义共享数据/对象需要不可变/可写一次/只读后构造类型。

    您需要同步您的收藏类型。 您可以使用随 JSR 166 发布的 java.util.concurrent 包中的集合类型,也可以使用 java.util.Collections.synchronizedCollection(Collection obj) 函数同步您的集合。

    请记住,与用于多线程操作的 synchronizedCollection 相比,并发收集要快得多且经过优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2012-06-29
      • 2016-04-17
      相关资源
      最近更新 更多