关于方法锁定的最佳实践

时间:2013-05-01 19:29:10

标签: c# .net locking synchronized

我有一个访问myst同步的方法,只允许一个线程同时通过它。这是我目前的实施:

private Boolean m_NoNeedToProceed;
private Object m_SynchronizationObject = new Object();

public void MyMethod()
{
    lock (m_SynchronizationObject)
    {
        if (m_NoNeedToProceed)
            return;

现在我正在考虑改变它有点像这样:

private Boolean m_NoNeedToProceed;
private Object m_SynchronizationObject = new Object();

public void MyMethod()
{
    if (m_NoNeedToProceed)
        return;

    lock (m_SynchronizationObject)
    {

在锁定它之前快速返回不应该更好,以便调用线程可以继续而无需等待前一个完成方法调用吗?

3 个答案:

答案 0 :(得分:1)

  

在锁定它之前快速返回不应该更好......

没有。锁定不仅仅是一种互斥机制,它还是一个内存障碍 1 。如果没有锁定,如果任何并发线程试图修改变量 2 ,则可能引入数据争用。

顺便说一句,当没有争用时,锁具有良好的性能,所以无论如何你都不会获得太多的性能。一如既往,不要对性能做出假设,尤其是“接近金属”。如果有疑问,请测量!

  

...这样调用线程可以在不等待前一个完成方法调用的情况下继续进行?

这只是意味着您持有锁的时间超过了必要的时间。一旦共享内存不再需要保护(这可能比方法退出更快),就释放锁定,并且您不需要试图人为地绕过它。


1 I.e。触发缓存一致性机制,以便所有CPU内核都能看到“相同”的内存。

2 例如,一个线程写入变量,但是这个更改在一个内核的写缓冲区中持续了一段时间,因此其他内核上的其他线程不会立即看到它。

答案 1 :(得分:0)

是的,只要m_NoNeedToProceed没有任何与之相关的竞争条件。

如果该方法需要很长时间才能运行,并且某些线程不需要实际访问该方法的关键部分。然后最好让他们尽早返回,而不是锁定。

答案 2 :(得分:0)

是的,在你锁定之前最好这样做。

点击m_NoNeedToProceed volatile

只是免责声明:易失性不会使其线程安全。它只会导致屏障检查另一个处理器中的值是否已更改。