假设一个类有一个public int counter由多个线程访问的字段.这int只是递增或递减.
要增加此字段,应使用哪种方法,为什么?
lock(this.locker) this.counter++;,Interlocked.Increment(ref this.counter);,counter为public volatile.现在,我发现volatile,我已经删除了许多lock语句和使用Interlocked.但是有理由不这样做吗?
我试图将一堆重复代码合并到一个具有以下结构的实用程序类中:
public class Shared<T>
{
private volatile T _value;
public object Lock { get; private set; }
public T Value
{
get { lock (Lock) return _value; }
set { lock (Lock) _value = value; }
}
public Shared(T startingValue)
{
_value = startingValue;
Lock = new object();
}
public Shared()
: this(default(T))
{
}
}
Run Code Online (Sandbox Code Playgroud)
但是,C# 不会让我。文档指出T必须是引用类型或原语之一(int、bool 等)。我唯一关心的类型是引用类型和 bool。显然,我不能使用无界类型T。有没有办法让我完成这项工作?甚至可以为此添加约束以使其作为Shared<bool>? 我什至不允许将其他结构类型标记为 volatile。:(
如果没有可能的方法将其标记为 volatile,当多个线程试图读取此值时,我是否还有其他保证不会对其进行优化?