2013-07-04 20 views
2

我在Java中實現阻塞文件鎖,並試圖獲取鎖我有一個代碼塊這樣的事情時:了Thread.sleep或產量輪詢時在Java中

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

的100值毫秒似乎對我來說過於僵化,我不知道如果我使用Thread.sleep(0)Thread.yield(),調度程序不能更加智能。在我看來,收益更好地交流意圖,但我不確定我完全理解JVM如何解釋它。一個選項明顯比另一個好嗎?

該文件是一個通過web服務訪問的遠程文件,它沒有阻塞鎖定方法,所以我必須自己實現阻塞。

+1

爲什麼不阻止?你沒有通過旋轉鎖定來完成任何有用的功能。 – EJP

+0

'yield'沒有有用的語義;它在Java 1.3之前的日子裏有一點,在某些平臺上JVM仍然使用綠色線程。 –

+0

@EJP這實際上是一個跨進程文件鎖定。我編輯了這個問題來澄清。 – MikeFHay

回答

3

使用收益率會使您的投票率更高,這可能不是您想要的。這就是爲什麼我將您當前的代碼視爲可接受的第一個解決方案。

另一方面,您可以使您的Web服務塊(延遲其響應,直到獲取鎖定)受到超時。這將是一個更穩固的解決方案,因爲一旦獲得鎖定,您就可以獲得快速反應,並且適度的輪詢速率。

0

我認爲等待是比其他任何事情都更好的選擇,原因是因爲其他線程可以在釋放鎖時進行通知。等待的好處是,它會立即通知,但睡眠不會。

+0

好的答案,但在我的情況下,這實際上是一個文件鎖,可以通過不同的過程獲得。我會編輯這個問題來澄清。 – MikeFHay