给出以下伪代码。一个功能可以同时由多个线程输入。我希望所有线程都执行a()
和c()
,但是b()
只能由进入同步块时未锁定的那些线程执行。
换句话说:如果线程必须等待锁,那么我希望它等待直到锁被释放,然后跳过b()
并立即继续使用c()
。
public void code() {
a() // check if page is present locally
if (pageMissing) {
synchronized (this) {
page = b(); // get page over REST
}
}
c() // access page
}
这有什么用?想象一下b()
调用一个外部REST函数来更新本地数据。当线程进入时,我们希望确保调用了该函数并更新了本地数据,但是一旦阻塞线程退出b()
,我们就知道本地数据是最新的,并且我们不想浪费资源让连续的线程已经在等待再次调用更新功能。
您可以具有一个volatile boolean
我会使用false
的某种风格,例如Lock
: