在同一個應用程序中的兩個「writer」服務之間共享文件的最佳方式是什麼?跨服務鎖定文件
編輯: 對不起,我應該給我更多的細節,我猜。
我有一個服務,將條目保存到緩衝區。當緩衝區滿時,它將所有條目寫入文件(依此類推)。另一個服務正在運行,讀取文件(實質上是複製/壓縮),然後將其清空。
在同一個應用程序中的兩個「writer」服務之間共享文件的最佳方式是什麼?跨服務鎖定文件
編輯: 對不起,我應該給我更多的細節,我猜。
我有一個服務,將條目保存到緩衝區。當緩衝區滿時,它將所有條目寫入文件(依此類推)。另一個服務正在運行,讀取文件(實質上是複製/壓縮),然後將其清空。
這裏是你可以做什麼總體思路:
public class FileManager
{
private final FileWriter writer = new FileWriter("SomeFile.txt");
private final object sync = new object();
public void writeBuffer(string buffer)
{
synchronized(sync)
{
writer.write(buffer.getBytes());
}
}
public void copyAndCompress()
{
synchronized(sync)
{
// copy and/or compress
}
}
}
你將不得不做一些額外的工作,把一切工作的安全,但是這僅僅是一個基本的例子給你一個想法它的外觀。
一種常見的鎖定方法是在主文件的相同位置創建第二個文件。第二個文件可能包含鎖定數據或爲空白。鎖定數據(如進程ID)的好處是您可以輕鬆檢測到過時的鎖文件,這是您必須計劃的必然性。雖然PID可能不是您的案例中最好的鎖定數據。
例如: 服務1:
myfile.lock
myfile
服務2:
myfile.lock
存在並且暫停/塊/等待myfile.lock
消失時,它會創建它,然後打開myfile。對於您在創建它之後再次檢查文件是否包含您的鎖定信息(特定於您的服務的標識)也是有利的 - 以防萬一兩個或更多服務正在等待並創建一個鎖完全相同的時間。最後一個成功,所有其他服務應該注意到他們的鎖定數據不再在文件中。另外 - 在檢查其內容之前暫停幾毫秒。
有趣的解決方案,但我不明白我可以如何使用它在我的情況。不管怎麼說,還是要謝謝你。 – charisk 2010-07-09 10:25:42
我明白了。我的解決方案適用於多個應用程序,但我看到您正在同步應用程序中的進程。我很困惑,因爲你稱他們爲「服務」。我同意接受的答案 - 「synchronized」關鍵字適合您的情況。 – 2010-07-09 16:57:35
我已經更新了我的答案......讓我知道它是否符合您的要求。 – Kiril 2010-07-08 16:44:22