假设有一个由2个线程访问的静态变量。
public static int val = 1;
现在假设线程1执行类似这样的语句
if(val==1)
{
val +=1
}
但是在检查之后和上面的语句中添加之前,线程2将val的值更改为其他值。
现在这会导致一些令人讨厌的错误。这发生在我的代码中。
有没有办法让线程1注意到val的值已被更改,而不是添加返回并再次执行检查。
答案 0 :(得分:6)
特别针对您的示例,您可以:
var originalValue = Interlocked.CompareExchange(ref val,
2, //update val to this value
1); //if val matches this value
if(originalValue == 1)
{
//the update occurred
}
答案 1 :(得分:3)
你可以使用锁:
var lockObj = new object();
if(val == 1) // is the value what we want
{
lock(lockObj) // let's lock it
{
if(val == 1) // now that it's lock, check again just to be sure
{
val += 1;
}
}
}
如果走这条路线,你必须确保修改val
的任何代码也使用具有相同锁定对象的锁。
lock(lockObj)
{
// code that changes `val`
}
答案 2 :(得分:0)
你可以使用锁来访问val或更新val。见http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx
答案 3 :(得分:0)
如果您希望以线程安全的方式增加整数值,可以使用静态Interlocked.Increment
方法:Interlocked.Increment Method (Int32)