我正在阅读有关线程和锁定的信息。通常的做法是您不能(也不应该)锁定值类型。
所以问题是,锁定值类型的推荐方法是什么?我知道有几种方法可以做一件事,但我还没有看到一个例子。虽然 MSDN 论坛上有一个很好的帖子,但我现在似乎找不到。
谢谢
使用另一个对象作为锁。
int valueType;
object valueTypeLock = new object();
void Foo()
{
lock (valueTypeLock)
{
valueType = 0;
}
}
您的问题的措辞使我认为您并不完全理解锁定。你不锁定数据,你锁定是为了保护数据的完整性。您锁定的对象是无关紧要的。重要的是您在代码的其他区域中锁定相同的对象,这些区域会改变受保护的数据。
根据您的情况,您可能可以通过利用 System.Threading.Interlocked 来避免使用锁,Jon 的示例中的相同代码变为:
System.Threading.Interlocked.Exchange(valueType,0)
我总是使用一个单独的变量来锁定:
object syncObj = new object();
void Foo()
{
lock(syncObj)
{
// do some stuff
}
}
无论如何,锁定值类型是没有意义的,因为值类型是不可变的并且不能被修改。锁定“this”也是有问题的,因为“this”对外部世界是可见的。
有关 Monitor 最初打算如何使用的一些信息,请参阅Monitor(同步)