2012-07-03 38 views
9

你能告诉我在等待条件之前是否应该释放锁吗?条件 - 请等待之前解锁?

try { 
    lock.lock(); 
    while (isNotEmpty()) { 
     condition.await(); 
    } 
} finally { 
    lock.unlock(); 
} 

或者

try { 
    lock.lock(); 
    while (isNotEmpty()) { 
     lock.unlock(); 
     condition.await(); 
    } 
} finally { 
    lock.unlock(); 
} 
+1

你读过[javadoc的(http://docs.oracle.com/javase/7/docs /api/java/util/concurrent/locks/Condition.html)? – assylias

+1

'acquire();尝试{use(); } finally {release(); }'。如果您获取('lock')失败,那么您将释放您从未拥有的资源。在这种情况下,您可以解锁[reentrant]锁的封闭锁。 –

回答

25

不,你不需要调用awaitawait会自动释放之前明确地解除锁定。从javadoc

与此条件相关的锁以原子释放, 当前线程用于线程调度目的,禁用[...]

和:

目前当调用此方法时,假定线程保存与此Condition关联的锁。

4

您可以在Condition当你有锁(仅await())ED相关的Lock

你为什么不有一个条件的isEmpty,使您的条件清晰。

请参阅Javadoc中的示例。 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html

例如

lock.lock(); 
try { 
    while (count > 0) 
    isEmpty.await(); 
    // do something when empty. 
} finally { 
    lock.unlock(); 
} 
+2

*“您无法等待锁定,您没有锁定。”*大概'lock'是与'condition'关联的锁定。 –

+0

@Tudor现在希望它更清晰。 –

0

等待和通知必须从同步块中调用,所以同样的规则适用于等待和信号。虽然自动等待发布,但如果你这样做应该是锁(之间)和unlock()

lock.lock()   // start of synchronized block 

condition.await() 

lock.unlock()  // end of synchronized block