1

如果我在 Java 中使用 ReentrantLock ...当一个线程拥有一个对象的锁并尝试获取另一个对象的另一个锁时,它是释放第一个锁还是仍然持有它?

4

2 回答 2

2

获取锁不会导致线程释放它已经获取的任何其他锁。Lock 接口的 API 文档指出 Lock 的实现可以持有多个锁,并使用了一种技术(手动锁定),除非一个线程一次可以持有多个锁(强调添加) :

虽然同步方法和语句的作用域机制使得使用监视器锁进行编程变得更加容易,并有助于避免许多涉及锁的常见编程错误,但在某些情况下,您需要以更灵活的方式使用锁。例如,一些遍历并发访问的数据结构的算法需要使用“hand-over-hand”或“链锁”:你获取节点 A 的锁,然后节点 B,然后释放 A 并获取 C,然后释放 B并获得 D 等等。Lock 接口的实现通过允许在不同范围内获取和释放锁以及允许以任意顺序获取和释放多个锁来启用此类技术

由于 ReentrantLock 实现了 Lock 这应该是适用的。

于 2015-02-11T17:26:53.693 回答
2

获取新锁不会释放之前持有的任何锁。你必须明确地释放它们,通常是在一个finally块内。

但始终要小心同时获取多个锁。始终检查您是否不会导致死锁。

于 2015-02-11T17:23:32.237 回答