2014-12-23 138 views
-1

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

+0

同步缓存值。 –

回答

2

是这样的:

static Object lock; 

... 

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

大部分时间都可以使用,但并非总是如此。第二个线程可以在第一个线程完成后比较'objectYouAreHopingHasBeenCached'到null,但是恰好在第一个线程获得锁之前。 – Hoopje

+0

这就是为什么我在同步块中再次检查对象。这样,您就可以拥有两全其美的领域 - 确保只取一次,但如果已经存在同步块,则快捷方式 – ControlAltDel

+0

Java 5 +中的双重检查锁定已经修复,只要该字段为* ** volatile **在这种情况下,在类声明中:'private volatile Object objectYouAreHopingHasBeenCached;' – dkatzel