不可变对象总是线程安全吗?

Jor*_*oba 1 c# immutability thread-safety

可以安全地假设使用或传递不可变对象总是线程安全的吗?

Luk*_*keH 9

是.如果一个对象是真正不可变的,没有发生内部突变,那么对象本身将是线程安全的.

(无论是处理对象还是以线程安全方式传递它都是另一回事!)

"内部突变"是什么意思?

许多对象似乎是从外部不可变的 - 例如,没有属性设置器或明显会触发突变的其他成员- 但这并不意味着对象的私有内部不能改变.

这就是为什么记录对象和/或其成员的可变性和线程安全性的重要性.否则,您的对象的消费者无法在不仔细检查内部的情况下发现这一点(这是一个实现细节,可能随时更改).

  • @Jorge:例如,访问属性getter可能会触发某些字段的初始化.同时从多个线程访问此属性可能会导致问题. (3认同)