C#线程中的只读字段安全吗?

问题描述 投票:24回答:3

C#线程中的readonly字段安全吗?

public class Foo
{
  private readonly int _someField;

  public Foo()
  {
    _someField = 0;
  }

  public Foo(int someField)
  {
    _someField = someField;
  }

  public void SomeMethod()
  {
     doSomething(_someField);
  }
}

看过一些帖子:

因此,如果在上面的代码中使用readonly字段,并且构造函数很轻,那么线程安全吗?如果_someField是引用类型(例如字符串数组)怎么办?

c# thread-safety readonly
3个回答
23
投票

是-您的代码不会在任何构造函数中公开this,因此在完全构造该对象之前,没有其他代码可以“看到”该对象。 .NET内存模型(从.NET 2开始)在每个构造函数的末尾都包含写屏障(IIRC-搜索Joe Duffy的博客文章以了解更多详细信息),因此,就目前而言,没有另一个线程看到“过时”值的风险据我所知。

我个人通常还是使用属性来代替将实现与API分开的一种方法,但是从线程安全的角度来看,这很好。


3
投票

这取决于领域。

从只读字段或小于字长(包括所有引用类型)的任何字段读取是原子操作。

但是,只读字段内的对象可能不是线程安全的。


1
投票

没有看您的示例,但是通常它取决于只读应用的内容,例如,如果字典被声明为只读,您仍然可以更新键值对

© www.soinside.com 2019 - 2024. All rights reserved.