簡體   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