我可以使用 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 object
的await() 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标准库代码时,提高你对编程的整体知识(通过阅读和思考这段代码可以学到很多东西)。但是除非你有充分的理由这样做:永远不要让 内部人员 指导你的代码!
我在 www 上看到的每个来源都指出 Condition Object
是通过在 Lock object
newCondition method
获得的
ReentrantLock.newCondition()
但是通过浏览 java 资源,我看到一个实现已经可用。
ConditionObject // implements Condition
我不想成为唯一一个,但这就是我问的原因。
我可以将此条件对象用于 wait/notify/notifyAll 同步方法吗?
还是坚持带锁的组合更好?
另外:
一个Condition object
的await() 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标准库代码时,提高你对编程的整体知识(通过阅读和思考这段代码可以学到很多东西)。但是除非你有充分的理由这样做:永远不要让 内部人员 指导你的代码!