更新时间:2023-11-20 22:39:16
Your loadSomeHeavyData
method could use a blocking mechanism to make all threads wait until it has finished its update, but only let one of them actually do the update:
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();
}
}
Note my assumptions:
doSomeProcessing
a second time with updated dataloadSomeHeavyData
once, ever - if not you will need to reset the flag and the CountdownLatch (which would then probably not be the most appropriate mechanism).EDIT
Your latest comment indicates that you actually want to call loadSomeHeavyData
more than once, just not more than once at a time.
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();
}
}