我有一个属性类型很长的属性(Int64).
如果它是一个int,那么我可以将支持字段声明为:
private volatile int _myInt;
Run Code Online (Sandbox Code Playgroud)
并创建一个简单的get和set访问器.
但是,即使使用x64项目设置,C#编译器也不允许使用类型为long的volatile关键字.所以情况是,即使我们确定读/写操作在这个变量上都是原子的,不幸的是,读取变量的线程有可能获得并使用旧的方式(处理器或CLR/JIT优化器)缓存值...
问题1:这是否意味着我不必简单地在get访问器中读取此值,而是使用Interlocked来防止读取缓存值?
get
{
return Interlocked.CompareExchange(ref _myLong, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)
这意味着一个相当开销......
问题2:仍然假设有保证的64位架构,在集合访问器中是否足够简单,如:
set
{
_myLong = value;
}
Run Code Online (Sandbox Code Playgroud)
提前致谢