gpt4 book ai didi

java - 为什么条件是从 Lock 创建的,而不是使用 'new' 运算符?

转载 作者:行者123 更新时间:2023-12-01 19:34:58 25 4
gpt4 key购买 nike

如果条件本身可以单独使用,并且创建代码只是:

    final ConditionObject newCondition() {
return new ConditionObject();
}

为什么不直接这样创建呢?在类ArrayBlockingQueue中,构造函数中有代码:

    lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();

其中 notEmptynotFull 都是 Condition 类的实例。

最佳答案

来自 Condition 的文档:

Condition factors out the Object monitor methods (wait, notify and notifyAll) into distinct objects to give the effect of having multiple wait-sets per object, by combining them with the use of arbitrary Lock implementations. Where a Lock replaces the use of synchronized methods and statements, a Condition replaces the use of the Object monitor methods.

Conditions (also known as condition queues or condition variables) provide a means for one thread to suspend execution (to "wait") until notified by another thread that some state condition may now be true. Because access to this shared state information occurs in different threads, it must be protected, so a lock of some form is associated with the condition. The key property that waiting for a condition provides is that it atomically releases the associated lock and suspends the current thread, just like Object.wait.

A Condition instance is intrinsically bound to a lock. To obtain a Condition instance for a particular Lock instance use its newCondition() method.

正如所解释的,Condition 实例必须Lock 实例1关联。将 Lock 函数作为创建 Condition 实例的工厂非常有意义,因为它暗示了两者之间的关系。强制执行这种关系的另一种方法是为 Condition 提供一个接受 Lock 实例的构造函数,但因为 Condition 也是一个接口(interface)它不能声明构造函数。我还认为,在这种情况下,无参工厂方法对用户更加友好。

注意:如果还不清楚的话,ReentrantLock 类是 Lock 接口(interface)和 ConditionObject 类是 Condition 接口(interface)的实现。

尝试直接使用 ConditionObject 的另一个问题是它是 AbstractQueuedSynchronizer2 的内部类(即非静态嵌套类) 。这意味着您需要后一个类的实例才能创建前一个类的实例。但是,ReentrantLock 使用的 AbstractQueuedSynchronizer 实现是一个实现细节,并未向公众公开。换句话说,您无法调用 ConditionObject 的构造函数,这意味着创建实例的唯一方法是通过 newCondition()

回顾一下,使用工厂方法创建 Condition 对象至少有三个原因:

  1. 它使LockCondition之间的关系变得清晰。
  2. 由于 LockCondition 都是接口(interface),因此您需要一种方法将 ConditionLock 关联起来在不了解实现的情况下。否则就不可能"program to an interface" .
  3. 由于 ConditionObject 是一个内部类,因此无法直接实例化,至少不能通过无法访问封闭类实例的代码来实例化。
<小时/>

1。 Condition 的方法仅在拥有 Lock 的上下文中才有意义。就像线程必须在对象上同步才能合法调用该对象的监视方法(即等待/通知)一样,线程必须在它之前拥有关联的Lock可以合法地调用Condition的方法(即await/signal)。

2。还有 AbstractQueuedLongSynchronizer ,它声明了自己的 ConditionObject 内部类。虽然该类与 AbstractQueuedSynchronizer 声明的类同名,但两者实际上是不同的类。

关于java - 为什么条件是从 Lock 创建的,而不是使用 'new' 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58181637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com