Java 正在使用Object.wait和Object.notify直接发出代码气味吗?

Java 正在使用Object.wait和Object.notify直接发出代码气味吗?,java,concurrency,Java,Concurrency,这可能会引起争议,但我只是意识到我很少直接使用wait和notify。相反,我使用包中的一些更高级别的构造。在某些用例中,等待和通知是唯一的解决方案,还是应该仅在构建更高级别的构造时使用它们?从我的观点来看,您完全正确:使用像java.util.concurrent这样的高阶构造要好得多。wait/notify系统容易出错,级别较低,并且存在问题(如信号丢失——“通知者”在“服务员”调用wait()之前发出信号) 因此,我看不到任何情况下使用wait/notify会更好。当然,如果你坚持使用Ja

这可能会引起争议,但我只是意识到我很少直接使用wait和notify。相反,我使用包中的一些更高级别的构造。在某些用例中,等待和通知是唯一的解决方案,还是应该仅在构建更高级别的构造时使用它们?

从我的观点来看,您完全正确:使用像java.util.concurrent这样的高阶构造要好得多。wait/notify系统容易出错,级别较低,并且存在问题(如信号丢失——“通知者”在“服务员”调用wait()之前发出信号)

因此,我看不到任何情况下使用wait/notify会更好。当然,如果你坚持使用JavaPre-1.5,那就除外

是否存在等待和通知是唯一解决方案的用例,或者它们应该仅在构建更高级别的构造时使用

它们仅应在构建更高级别的构件时使用。如果现有的高级构造无法解决问题,则不希望恢复为等待/通知;您希望设计一个更高级别的构造来解决您的问题。您可以使用wait/notify来实现它

例如,我曾经遇到一个问题,需要并发执行一组具有层次依赖关系的任务,其中依赖关系条件涉及连接(“and”)和分离(“or”)的组合。也就是说,有些情况下,一项任务的条件是“任务A完成,任务B完成”,有些情况是“任务A完成或任务B完成”,以及这些条件的各种组合(例如,“任务A完成,任务B或任务C完成”)

因此,我编写了一个小型实用程序库,它为客户提供了一个界面,让客户提交带有条件注释的任务集合,在满足先决条件后将这些任务提交给执行者,并监控任务完成情况以启动新的合格任务。其中一些是使用
java.util.concurrent
(主要是
Executor
Semaphore
)实现的,但其他部分涉及使用wait/notify(使用wait/notify通知“协调器”线程任务完成)


因此,代码最终更易于理解和排除故障,后来我们发现了同一任务协调器库的其他用途。

说它们在任何情况下都不会更好,这有点狭隘。并发包中的更高级别构造当然涵盖了最常见的并发场景,但它们决不是exhaustive@jtahlborn你能想出一个很好的例子吗?我很好奇是否有一类特定的问题适合它们。好吧,对于java.util.concurrent中的Condition.await/signal,您无法处理wait/notify。因此,从技术上讲,wait/notify在任何java 1.5+项目中看起来都不太受欢迎,好吧,但是对于标准用法,使用wait/signal和wait/notify没有区别,使用synchronized()块比使用lock()w/try/finally块更简单,所以对于简单的情况,我更喜欢使用wait/notify。(显然,您还可以通过条件执行其他额外的操作,但前提是这不是必需的)。@scompt.com-当然,您可以随时在多线程系统中管理共享状态。我当前代码库中的一个例子是一个类似于线程池的类,除了使用单独的进程而不是线程(因此我需要跟踪当前正在运行的进程数量,并酌情处理启动/排队新工作)。并发包中没有任何东西可以为我做这件事。