scala不可变集合是否是线程安全的?

时间:2017-01-30 11:23:52

标签: scala

我想知道一个不可变的scala集合(例如immutable.HashMap)是否是线程安全的。内容可能显然不会改变,但我不清楚优化内部的可变状态。

假设键和值是不可变的

感谢您的帮助

2 个答案:

答案 0 :(得分:8)

不,他们不是。

即使集合是不可变的,它们也可能具有一些内部可变状态。例如,Vector和List的文档明确说明了它

  

注意:尽管是一个不可变的集合,但实现在构造期间内部使用了可变状态。这些状态更改在单线程代码中是不可见的,但在某些多线程方案中可能会导致竞争条件。新集合实例的状态可能尚未发布" (就Java内存模型规范而言),以便来自另一个线程的非同步非易失性读取可能会观察到处于无效状态的对象(有关详细信息,请参阅SI-7838)。请注意,这样的读取根本不能保证看到写入的对象,因此不管这个问题如何都不应该使用。最简单的解决方法是通过volatile var。

在线程之间交换值

答案 1 :(得分:1)

他们是。

每次更新都会创建新集合。为避免不必要的副本,使用结构共享,因此您始终可以引用某个版本的集合,并且该特定版本是线程安全的。