[英]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.