繁体   English   中英

如何正确确定锁的范围

[英]How to properly scope a lock

假设我有一个ReentrantLock

ReentrantLock foo = new ReentrantLock();

以及使用锁的方法bar

public void bar()
{
    foo.lock();

    try
    {
        methodOne();
    }
    finally
    {
        foo.unlock();
    }
}

methodOne调用一个方法methodTwo同样使用该锁,

public void methodTwo()
{
    foo.lock();

    try
    {
        // do something
    }
    finally
    {
        foo.unlock();
    }
}

是它更好地释放锁在bar前我打电话methodOne 通常,在调用另一个方法之前释放锁是一种好习惯吗?

不,您不应该那样做。 如果这样做,任何并发线程都可以在bar()方法的中间获取锁,这正是您希望通过使用锁来避免的锁。

确切地说,它被称为ReentrantLock,因为它允许在同一线程中多次获取锁。 每次调用lock()时,计数器都会递增,而每次调用unlock()时,计数器都会递减,因此您只需要确保在finally块中始终调用unlock()

请注意,仅通过使用同步块,代码就不会那么脆弱,因为不可能忘记关闭同步块。

完成锁“保护”的关键操作后,松开锁。 不早于。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM