Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
scala不可变集合是线程安全的吗?_Scala - Fatal编程技术网

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

scala不可变集合是线程安全的吗?,scala,Scala,我想知道不可变的scala集合(例如immutable.HashMap)是否是线程安全的。内容可能显然不会改变,但我不清楚优化内部的可变状态 假定键和值是不可变的 谢谢你的帮助,他们很好 每次更新都会创建新集合。为了避免不必要的复制,使用了结构共享,因此您可以始终引用某个版本的集合,并且该特定版本是线程安全的。不,它们不是 即使集合是不可变的,它们也可能有一些内部可变状态。例如Vector的文档,并明确说明它 注意:尽管是一个不可变的集合,但该实现在构造期间在内部使用可变状态。这些状态更改在单线

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

假定键和值是不可变的

谢谢你的帮助,他们很好

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

不,它们不是

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

注意:尽管是一个不可变的集合,但该实现在构造期间在内部使用可变状态。这些状态更改在单线程代码中是不可见的,但在某些多线程场景中可能会导致争用条件。新集合实例的状态可能尚未“发布”(在Java内存模型规范的意义上),因此从另一个线程进行的非同步非易失性读取可能会观察到对象处于无效状态(有关详细信息,请参阅)。请注意,这样的读取根本不能保证看到写入的对象,因此不应使用,不管这个问题如何。最简单的解决方法是通过volatile变量在线程之间交换值


什么是“内部的可变状态”?显然,如果要操作由不可变集合保留的对象,它将不会是线程安全的。这些对象也应该是不可变的immutable@ipoteka不知道,一些数据的重新排列是的,它们是线程安全的。谢谢你的帮助。有关于这方面的官方文件吗?Java HashMap文档明确指出,get是线程安全的,而不对集合进行更新。@ogen您不能对不可变集合进行更新。不变性自动为您提供线程安全。@puhlen这是不正确的,不变性不能保证线程安全,它只是意味着接口中没有任何可变状态。不可变的数据结构可能包含供内部使用的可变数据,因此可能不是线程安全的。@Tim如果可变状态未公开,则意味着它无法变异(您无法变异无法访问的内容),这使得它。。。不可变。@Dima这不正确。不可变对象上的方法可以改变内部状态。然后,该状态可用于优化未来的函数调用。例如,
lazy val
或备忘录。接口保持不变,因为它不允许更改外部可见状态。请注意“在构造期间”注释。构建后的不可变集合是线程安全的。在此之前,它们是不存在的。请注意,“在某些多线程场景中,实现[…]可能导致争用条件”和“从另一个线程进行的非同步非易失性读取可能会观察到对象处于无效状态”。换句话说,它并不总是线程安全的。