pub*_*cgk 23 c# readonly thread-safety
C#线程中的只读字段是否安全?
public class Foo
{
private readonly int _someField;
public Foo()
{
_someField = 0;
}
public Foo(int someField)
{
_someField = someField;
}
public void SomeMethod()
{
doSomething(_someField);
}
}
Run Code Online (Sandbox Code Playgroud)
经历了一些帖子:
- 在C#中将字段标记为只读有什么好处?- JaredPar认为,曾经构建的只读字段是不可变的,因此是安全的.
- Readonly Fields和Thread Safety,表明如果构造函数做了很多工作,那么存在一些风险.
因此,如果在上面的代码中使用readonly字段,并且构造函数很轻,那么它是否是线程安全的?如果someField是ref类型(例如字符串数组)怎么办?
Jon*_*eet 22
是的 - 您的代码不会this在任何构造函数中公开,因此在完全构造之前,没有其他代码可以"看到"该对象..NET内存模型(从.NET 2开始)在每个构造函数的末尾都包含一个写屏障(IIRC - 搜索Joe Duffy的博客文章以获取更多详细信息),因此没有其他线程看到"陈旧"值的风险,到目前为止我知道.
我个人仍然经常使用属性,作为一种将实现与API分离的方法,但从线程安全的角度来看,这很好.
| 归档时间: |
|
| 查看次数: |
5178 次 |
| 最近记录: |