在Java中轮询时线程休眠或屈服



我在Java中实现了一个阻塞文件锁,当试图获取锁时,我有一个代码块,如下所示:

while(!fileLockIsAcquired())
{
    Thread.sleep(100); //is this cool?
    tryAcquireFileLock();
}

100毫秒的值对我来说似乎过于死板,我想知道如果我使用Thread.sleep(0)Thread.yield(),调度器是否会更智能。Yield在我看来可以更好地传达意图,但我不确定我是否完全理解JVM是如何解释它的。一种选择显然比另一种好吗?

该文件是通过没有阻塞锁定方法的Web服务访问的远程文件,所以我必须自己实现阻塞。

使用yield会使您的轮询率高得多,这可能不是您想要的。这就是为什么我认为您当前的代码是可接受的第一个解决方案。

另一方面,您可以使您的Web服务块(将其响应推迟到获取锁为止)超时。这将是一个更可靠的解决方案,因为一旦获得锁,您既可以快速反应,也可以适度轮询。

我认为等待是一个比其他任何事情都更好的选择,原因是其他线程可以在释放锁时发出通知。等待的好处是,一旦接到通知,它就会立即出来,但睡眠不会。

相关内容

  • 没有找到相关文章

最新更新