2012-11-27 57 views
1

因此,我需要創建一個文件,然後向它寫入一行,並且這必須是原子的。因此,在初始化時,沒有其他進程可以修改文件。
我有一個想法,鎖定不同的東西,然後鎖定,做的操作,然後釋放鎖讓對方進來。它可能不是原子的(我猜)。沒有其他辦法可以做到這一點?在操作系統級別的一次原子操作中創建並寫入文件

回答

3

我建議你寫臨時文件,然後重命名它到你的文件。我不確定這個操作在java中是否作爲所有操作系統的原子實現,但至少在Unix上你有機會,因爲我認爲它使用與原子相同的調用mv

我猜,它在windows上不會是真正的原子。對於大多數應用來說,這將是「幾乎是原子的」。

+0

感謝我們已經考慮過它,但它的javadoc是相當令人沮喪的...無論如何,除了java7'Files.move',似乎沒有其他選擇。太糟糕了,我們在java6 ... – zeller

0

如果你想要安全的保護其他進程,我建議你閱讀http://en.wikipedia.org/wiki/File_locking並利用JNI來達到操作系統級別。

+0

但是,如果我創建文件,然後鎖定它,這也是2操作不是原子的(至少用'FileLock')。另一個過程可能會在兩個步驟之間溜走,對嗎? – zeller

+0

會幫助你知道你的操作系統是如何處理更具體的答案的。 –

+0

win7。而在未來,它仍然會贏得任何。無論如何,這不是一個值得關注的問題,我們願意讓這部分原生。我們很可能會堅持創建 - 然後重命名的情況。 – zeller