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