基于哪个实现 await 和 signalAll 工作
based on which implementation does await and signalAll work
我正在阅读 java 中的 reentrantlock
以及我们如何通过使用接口 Condition
中的 newCondition()
方法来了解锁定条件,但后来我看到了在 documentation of the interface Condition 中,用户必须提供其使用的实现。
Implementation Considerations:
The current thread is assumed to hold the lock associated with this Condition when this method is called. It is up to the implementation to determine if this is the case and if
not, how to respond.
自从几天以来我一直在研究哲学家用餐问题并且不得不使用 signalAll() 和 await() 而没有任何自行提供的实现!
每个示例我使用了这一行:
((Philosopher) right).getNeighborCondition().await();
对象 right
声明如下:
Iphilosopher right= new Philosopher();
Iphilosopher
是一个接口,Philosopher
是实现它并扩展 Thread
.
的 class
当单击方法 await()
上的 Ctrl + left mouse click
时,我看到一个接口无效方法,该方法抛出 InterruptedException
.
那么调用 await()
或 signalAll()
时使用的是哪个实现?!
您对 Javadoc 的理解有点不正确。这是您关注的 Condition#await()
的 Javadoc 部分:
Implementation Considerations
The current thread is assumed to hold the lock associated with this Condition
when this method is called. It is up to the implementation to determine if this is the case and if not, how to respond. Typically, an exception will be thrown (such as IllegalMonitorStateException
) and the implementation must document that fact.
这是在说三件事:
调用await()
时当前线程必须持有锁。前面的文档和 Lock#newCondition()
:
的文档进一步支持了这一点
Before waiting on the condition the lock must be held by the current thread.
Condition
实现负责确定当前线程是否持有锁。
- 如果当前线程没有持有锁,那么应该发生什么是未指定的。
- 然后它继续说 典型的 实现将在这种情况下抛出
IllegalMonitorStateException
并且无论选择哪种方法都必须由实现记录。
没有任何地方说 用户 必须提供 Condition#await()
的实现。它所说的只是 Lock
的 开发人员 ,并且扩展 Condition
,实施必须编写符合合同的代码,并提供必要的文档。
你提到 ReentrantLock
,它是 Lock
的完整实现,所以让我们关注 class。这是 ReentrantLock#newCondition()
文档的摘录:
- If this lock is not held when any of the
Condition
waiting or signalling methods are called, then an IllegalMonitorStateException
is thrown.
这解决了上面的第三点。该文档指出,当 await()
(以及每个相关方法)被不持有锁的线程调用时,返回的 Condition
实例将抛出 IllegalMonitorStateException
。
但直接回答您的问题:正在使用的 Condition
的实现是 Lock#newCondition()
返回的任何实现。您不应该关心返回的确切类型,因为那是一个实现细节。下面是一些相关的概念:
- Programming to an interface
- Factory methods
Lock#newCondition()
是工厂方法。
如果你真的想知道 Condition
的哪个实现被使用,你总是可以查看源代码1。 ReentrantLock
class 当前使用 ConditionObject
.
的实例
1. 警告: java.util.concurrent.locks
classes 的实现非常重要,并且处理并发的复杂性。不过确定使用的Condition
的实现应该不会太难。
我正在阅读 java 中的 reentrantlock
以及我们如何通过使用接口 Condition
中的 newCondition()
方法来了解锁定条件,但后来我看到了在 documentation of the interface Condition 中,用户必须提供其使用的实现。
Implementation Considerations:
The current thread is assumed to hold the lock associated with this Condition when this method is called. It is up to the implementation to determine if this is the case and if not, how to respond.
自从几天以来我一直在研究哲学家用餐问题并且不得不使用 signalAll() 和 await() 而没有任何自行提供的实现!
每个示例我使用了这一行:
((Philosopher) right).getNeighborCondition().await();
对象 right
声明如下:
Iphilosopher right= new Philosopher();
Iphilosopher
是一个接口,Philosopher
是实现它并扩展 Thread
.
当单击方法 await()
上的 Ctrl + left mouse click
时,我看到一个接口无效方法,该方法抛出 InterruptedException
.
那么调用 await()
或 signalAll()
时使用的是哪个实现?!
您对 Javadoc 的理解有点不正确。这是您关注的 Condition#await()
的 Javadoc 部分:
Implementation Considerations
The current thread is assumed to hold the lock associated with this
Condition
when this method is called. It is up to the implementation to determine if this is the case and if not, how to respond. Typically, an exception will be thrown (such asIllegalMonitorStateException
) and the implementation must document that fact.
这是在说三件事:
调用
的文档进一步支持了这一点await()
时当前线程必须持有锁。前面的文档和Lock#newCondition()
:Before waiting on the condition the lock must be held by the current thread.
Condition
实现负责确定当前线程是否持有锁。- 如果当前线程没有持有锁,那么应该发生什么是未指定的。
- 然后它继续说 典型的 实现将在这种情况下抛出
IllegalMonitorStateException
并且无论选择哪种方法都必须由实现记录。
- 然后它继续说 典型的 实现将在这种情况下抛出
没有任何地方说 用户 必须提供 Condition#await()
的实现。它所说的只是 Lock
的 开发人员 ,并且扩展 Condition
,实施必须编写符合合同的代码,并提供必要的文档。
你提到 ReentrantLock
,它是 Lock
的完整实现,所以让我们关注 class。这是 ReentrantLock#newCondition()
文档的摘录:
- If this lock is not held when any of the
Condition
waiting or signalling methods are called, then anIllegalMonitorStateException
is thrown.
这解决了上面的第三点。该文档指出,当 await()
(以及每个相关方法)被不持有锁的线程调用时,返回的 Condition
实例将抛出 IllegalMonitorStateException
。
但直接回答您的问题:正在使用的 Condition
的实现是 Lock#newCondition()
返回的任何实现。您不应该关心返回的确切类型,因为那是一个实现细节。下面是一些相关的概念:
- Programming to an interface
- Factory methods
Lock#newCondition()
是工厂方法。
如果你真的想知道 Condition
的哪个实现被使用,你总是可以查看源代码1。 ReentrantLock
class 当前使用 ConditionObject
.
1. 警告: java.util.concurrent.locks
classes 的实现非常重要,并且处理并发的复杂性。不过确定使用的Condition
的实现应该不会太难。