如何正确锁定值类型?

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

所以问题是,锁定值类型的推荐方法是什么? 我知道有几种方法可以做一件事,但我还没有看到一个例子。 虽然在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 } } 

锁定值类型无论如何都没有意义,因为值类型是不可变的并且无法修改。 锁定“这个”也是有问题的,因为“这个”对于外部世界是可见的。

有关Monitor最初打算如何使用的一些信息,请参阅Monitor(同步)