我在Java中实现了一个阻塞文件锁,当试图获取锁时,我有一个代码块,如下所示:
while(!fileLockIsAcquired())
{
Thread.sleep(100); //is this cool?
tryAcquireFileLock();
}
100毫秒的值对我来说似乎过于死板,我想知道如果我使用Thread.sleep(0)
或Thread.yield()
,调度器是否会更智能。Yield在我看来可以更好地传达意图,但我不确定我是否完全理解JVM是如何解释它的。一种选择显然比另一种好吗?
该文件是通过没有阻塞锁定方法的Web服务访问的远程文件,所以我必须自己实现阻塞。
使用yield会使您的轮询率高得多,这可能不是您想要的。这就是为什么我认为您当前的代码是可接受的第一个解决方案。
另一方面,您可以使您的Web服务块(将其响应推迟到获取锁为止)超时。这将是一个更可靠的解决方案,因为一旦获得锁,您既可以快速反应,也可以适度轮询。
我认为等待是一个比其他任何事情都更好的选择,原因是其他线程可以在释放锁时发出通知。等待的好处是,一旦接到通知,它就会立即出来,但睡眠不会。