关于方法锁定的最佳实践

本文关键字:最佳 锁定 于方法 方法 | 更新日期: 2023-09-27 18:11:38

我有一个方法访问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)
    {

在锁定它之前做一个快速返回是不是更好,这样调用线程可以继续而不等待前一个线程完成方法调用?

关于方法锁定的最佳实践

在锁定它之前做一个快速返回不是更好吗…

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

顺便说一句,锁在没有争用的情况下有很好的性能,所以你不会获得太多的性能。与往常一样,不要对性能做出假设,尤其是在"接近金属"的情况下。如果有疑问,测量一下!

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

这只是意味着您持有锁的时间超过了必要的时间。一旦共享内存不再需要保护(可能早于方法退出),就释放锁,您不需要尝试人为地规避它。


1即触发缓存一致性机制,使所有CPU内核看到"相同"内存。

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

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

如果方法需要很长时间运行,并且一些线程不需要实际访问方法的关键部分。那么最好是让他们在不获得锁的情况下提前返回。

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

使m_NoNeedToProceed 易失

只是一个免责声明:volatile不能使其线程安全。它只会产生一个屏障来检查值是否在另一个处理器中发生了更改。