【发布时间】:2019-04-17 09:24:32
【问题描述】:
我有一个 Java UI 服务,该服务有一个 API 方法,该方法调用一个相对较慢的操作(比如约 30 秒)。该操作是无参数的,但它对随时间变化(相对缓慢)的外部数据进行操作。该方法返回最新结果并不重要 - 如果它们是 30 秒旧的,这是可以接受的。
最终我需要优化慢操作的实现,但作为短期修复,我想让操作互斥,这样如果第二个传入请求(在单独的线程上)尝试调用当另一个操作已经在进行中时,第二个操作会阻塞,直到第一个操作完成。然后第二个线程使用第一次调用操作的结果 - 即它不会尝试再次运行该操作。
例如:
class MyService {
String serviceApiMmethod() {
// If a second thread attempts to call this method while another is in progress
// then block here until the first returns and then use those results
// (allowing it to return immediately without a second call to callSlowOperation).
return callSlowOperation();
}
}
Java (8) 中首选的通用方法是什么。我猜我可以使用 CountDownLatch,但目前尚不清楚如何最好地在线程之间共享结果。是否有现有的并发原语可以促进这一点?
编辑:一旦所有线程都使用了结果(即返回给调用者),我需要清除对结果的任何引用,因为它是相对较大的对象,需要被 GC 处理为尽快。
【问题讨论】:
标签: java concurrency countdownlatch