如何正确锁定值类型?

时间:2009-01-07 15:52:11

标签: c# locking

我正在阅读有关线程和锁定的信息。通常的做法是你不能(不应该)锁定值类型。

所以问题是,锁定值类型的推荐方法是什么?我知道有几种方法可以做一件事,但我还没有看到一个例子。虽然在MSDN论坛上有一个很好的主题,但我现在似乎无法找到它。

由于

4 个答案:

答案 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)