通过锁定助手,我指的是可以通过using
语句实现锁定的一次性对象。例如,考虑Jon Skeet 的 MiscUtilSyncLock
类的典型用法:
public class Example
{
private readonly SyncLock _padlock;
public Example()
{
_padlock = new SyncLock();
}
public void ConcurrentMethod()
{
using (_padlock.Lock())
{
// Now own the padlock - do concurrent stuff
}
}
}
现在,考虑以下用法:
var example = new Example();
new Thread(example.ConcurrentMethod).Start();
我的问题是这个 - 因为example
是在一个线程上创建并在另一个线程ConcurrentMethod
上调用的,所以ConcurrentMethod
线程不能忘记_padock
构造函数中的赋值(由于线程缓存/读写重新排序),因此抛出一个NullReferenceException
(on_padLock
本身)?
我知道使用Monitor
/锁定具有lock
内存屏障的好处,但是当使用诸如此类的锁定助手时,我不明白为什么可以保证这样的屏障。在这种情况下,据我了解,必须修改构造函数:
public Example()
{
_padlock = new SyncLock();
Thread.MemoryBarrier();
}
编辑Hans Passant 建议创建线程意味着内存屏障。那么怎么样:
var example = new Example();
ThreadPool.QueueUserWorkItem(s => example.ConcurrentMethod());
现在不一定要创建线程...