2013-02-16 94 views
1

比方说,我有一个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(); 
    } 
} 

是否更好释放th在拨打电话methodOne之前,请锁上bar?一般来说,在调用另一种方法之前释放锁是否是一种好的做法?

回答

3

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

它被称为ReentrantLock正是因为它允许在同一个线程中多次获取锁。计数器每次调用lock()时都会递增,并且每次调用unlock()时都会减1,所以您只需确保总是在finally块中调用unlock()

请注意,通过简单地使用同步块,代码将不太脆弱,因为不可能忘记关闭同步块。

2

当锁“保护”的关键操作完成时释放锁。不早于。