您的
loadSomeHeavyData方法可以使用阻塞机制使所有线程等待更新完成,但是实际上只能让其中一个执行更新:
private final AtomicBoolean updateStarted = new AtomicBoolean();private final CountDownLatch updateFinished = new CountDownLatch(1);public void loadSomeHeavyData() { if (updateStarted.compareAndSet(false, true)) { //do the loading updateFinished.countDown(); } else { //update already running, wait updateFinished.await(); }}
注意我的假设:
- 您希望所有线程都等到加载完成后才能
doSomeProcessing
再次调用更新的数据 - 您只需调用
loadSomeHeavyData
一次-否则,您将需要重置标志和CountdownLatch(这可能不是最合适的机制)。
编辑
您最近的评论表明您实际上想
loadSomeHeavyData多次拨打电话,一次最多拨打 一次 。
private final Semaphore updatePermit = new Semaphore(1);public void loadSomeHeavyData() { if (updatePermit.tryAcquire()) { //do the loading and release updatePermit when done updatePermit.release(); } else { //update already running, wait updatePermit.acquire(); //release the permit immediately updatePermit.release(); }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)