【问题标题】:Make threads wait for the execution of another thread让线程等待另一个线程的执行
【发布时间】:2015-02-22 00:23:27
【问题描述】:

在 Java ZK 应用程序中,在 ViewModel 中,我有多个线程执行特定功能。任何线程第一次执行该函数需要很长时间,但在执行一次后,它会在其他线程执行时立即返回,因为此时它已在缓存中检索到值。但是第一次应该只由一个线程执行,好像多个线程执行该函数一样,它不会返回任何一个,因为当每个线程调用相同的函数时缓存仍然是空的,因此返回时间加起来为他们所有人。 那么如何让其他线程等待第一个线程完成,因为线程属于不同的对象,因此同步方法在这里不起作用。可以在这里使用一个变量来与第一个线程已完成的其他线程通信吗?请注意,所有线程属于同一类的不同对象,即 ViewModel,它不能扩展线程类或实现 Runnable,因为它是 ZK 框架类。 可以提出任何解决方案。

【问题讨论】:

  • 同步缓存值。

标签: java multithreading asynchronous threadpool zk


【解决方案1】:

类似这样的:

static Object lock;

...

if (objectYouAreHopingHasBeenCached == null) {
  synchronized (lock) {
    if (objectYouAreHopingHasBeenCached == null) {
       // fetch the object, put in in objectYouAreHopingHasBeenCached
    }
  }
}
return objectYouAreHopingHasBeenCached;

【讨论】:

  • 这在大多数情况下都会起作用,但并非总是如此。第二个线程可能会在第一个线程之后,但在第一个线程获取锁之前将objectYouAreHopingHasBeenCached 与 null 进行比较。
  • 这就是我在同步块中再次检查对象的原因。这样,您可以两全其美 - 确保只获取一次,但如果同步块已经存在,则快捷方式
  • 双重检查锁定已在 Java 5 + 中得到修复,只要字段为 volatile,在这种情况下,在类声明中: private volatile Object objectYouAreHopingHasBeenCached;
猜你喜欢
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2010-09-22
  • 2011-07-10
  • 1970-01-01
相关资源
最近更新 更多