我可以使用 ConditionObject 而不是从锁中获取它吗?

Can I use ConditionObject instead of getting it from a lock?

我在 www 上看到的每个来源都指出 Condition Object 是通过在 Lock object

上使用 newCondition method 获得的
ReentrantLock.newCondition()

但是通过浏览 java 资源,我看到一个实现已经可用。

ConditionObject // implements Condition

我不想成为唯一一个,但这就是我问的原因。

我可以将此条件对象用于 wait/notify/notifyAll 同步方法吗?

还是坚持带锁的组合更好?

另外:

一个Condition objectawait() method代码太多了。传统的 wait/notify/notifyAll 之间会有性能差异吗?

我不确定您在哪里找到 ConditionObject,但它很可能是锁 class.

使用的某个内部对象

如果没有锁(准确地说是监视器),条件不能单独存在,这是因为 await/signal 需要访问该监视器。 当你调用 await 方法时,它会将当前线程放在监视器的等待列表中,挂起它(停放它,因此它被排除在调度之外)并且它会释放锁,以便其他线程可以获取它. 当您调用 signal 时,正在恢复监视器等待列表中的一个线程。

没有关联的锁,您将无法使用它。 ConditionObject 连接到 AbstractQueuedSynchronizer,可用于创建锁、信号量和其他东西,因此您无需担心细节。

java.util.concurrent.locks 包中为您提供了易于使用的并发原语。我建议您使用它们,这样您出错的可能性就会降低。

这里给个概念性的回答:

But by navigating the java sources i saw that a implementation is already available.

换句话说:使用 public 标准 API 的代码是否应该依赖 API 的 内部实现细节

答案(几乎)总是:当然不是

你让你的代码依赖于 public API 提供的契约,而不是它是如何实现的。事情是,(至少理论上)这样的内部实现细节可以随着 Java 的任何新版本而改变。当然,如果它是一个结构性的东西,那么编译器可能会告诉你,但如果不是呢?

意思是:当你学习java标准库代码时,提高你对编程的整体知识(通过阅读和思考这段代码可以学到很多东西)。但是除非你有充分的理由这样做:永远不要让 内部人员 指导你的代码!