c# - 为什么不可变对象(immutable对象)是线程安全的?

标签 c# .net clr thread-safety immutability

class Unit {
    private readonly string name;
    private readonly double scale;

    public Unit(string name, double scale) {
        this.name = name;
        this.scale = scale,
    }

    public string Name { get { return name; } }
    public string Scale { get { return scale; } }

    private static Unit gram = new Unit("Gram", 1.0);

    public Unit Gram { get { return gram; } }
}

多个线程可以访问Unit.Gram。为什么多个线程同时读取 Unit.Gram.Title 可以?

我担心的是它们指的是同一个内存位置。一个线程开始读取该内存,那么它不是被“锁定”了吗? .NET 是否处理下面这个关键部分的同步?还是我认为同步阅读需要同步是错误的?

最佳答案

是什么让对象不是线程安全的?如果对象的值/状态在线程读取时可以更改,则该对象不是线程安全的。如果第二个线程在第一个线程读取该对象的值时更改了该对象的值,通常会发生这种情况。

根据定义,不可变对象(immutable对象)不能更改值/状态。由于每次读取不可变对象(immutable对象)时它都具有相同的值/状态,因此您可以让任意数量的线程毫无顾虑地读取该对象。

关于c# - 为什么不可变对象(immutable对象)是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3595114/

相关文章:

c# - 在 silverlight 和异步回调中保存文件

c# - 用所有已注册的文件类型(不仅仅是扩展名)填充 ComboBox 的最有效方法是什么

c# - 将单词 TOTAL 添加到 Gridview 的最后一行

.net - 不同的 Windows XP 风格正在改变我的控件外观,我该如何避免呢?

.net - 将字节数组转换为 int 的更快方法

c# - 如何在城市周围添加半径/邻近度以估算流量(Google Adwords)?

.net - 将 int32 添加到 64 位 native int 的结果?

c# - 在单例中播种 Random() 的最佳方法

c# - 在哪里可以使用 ILSpy 查看原始类型的运算符重载?

c# - 取消固定在 .NET 套接字服务器中自动固定的 byte[]