Kyl*_*oN- 1 multithreading scala race-condition
cons-operator ::在给定列表上是否是线程安全的?
例如,如果2个线程在同一个列表中使用cons-operator会发生什么?
val listOne = 1::2::3::Nil
val listTwo = 4::5::Nil
val combinedList = listOne ::: listTwo // thread1
val combinedList2 = listOne ::: 7:8:NIL // thread2 on the same time
Run Code Online (Sandbox Code Playgroud)
添加吉姆柯林斯给出的答案:
对不可变数据结构的所有操作通常都是线程安全的.list cons运算符不会修改原始列表,因为每个列表都是不可变的.相反,它会创建一个新列表,表示列表的更改状态.
线程同步问题仅在不同线程想要更改内存中的相同数据时出现.此问题称为"共享状态".不可变对象是无状态的,因此不存在共享状态.
Scala还提供可变数据结构.查看包名称中的"mutable"一词.那些具有与Java集合相同的同步问题.
默认情况下,如果只是List在Scala程序中键入,而不添加任何特殊import语句,Scala将使用不可变列表.这同样适用于Set,Map等等.
经验法则:如果一个类不包含var语句,并且没有对包含var语句的任何其他类的引用,则可以将其视为不可变.这意味着它可以安全地在线程之间传递.(我知道专家可以很容易地从这个规则中构造异常,但只要你不知道其他任何东西,这是一个非常好的规则,边缘情况被搁置.)
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |