我正在尋找一種同步方法,以確保我的後端數據(xml文件)在多個客戶端訪問期間保持不變。xml文件的同步方法
我正在使用jaxb來讀寫文件。我想確保當客戶端讀取或寫入xml文件的信息時,沒有其他客戶端正在同時訪問它。
我已閱讀了關於ReadWriteLock
並想知道這是否是最佳解決方案?顯然客戶端應該運行某種查詢來查看是否有任何內容正在寫入文件,如果不是,那麼繼續讀/寫?
我對java很陌生,原諒我的無知!
感謝
我正在尋找一種同步方法,以確保我的後端數據(xml文件)在多個客戶端訪問期間保持不變。xml文件的同步方法
我正在使用jaxb來讀寫文件。我想確保當客戶端讀取或寫入xml文件的信息時,沒有其他客戶端正在同時訪問它。
我已閱讀了關於ReadWriteLock
並想知道這是否是最佳解決方案?顯然客戶端應該運行某種查詢來查看是否有任何內容正在寫入文件,如果不是,那麼繼續讀/寫?
我對java很陌生,原諒我的無知!
感謝
您的問題涉及到不同的「客戶端」 - 大概應用程序運行在不同的JVM中。
如果是這種情況,ReadWriteLock
類不會幫助。該類用於在單個JVM中執行不同線程的同步。
你真正想要的是FileLock
類。這會鎖定文件或文件的區域以防止其他JVM訪問。你需要做這樣的事情:
FileInputStream fis = new FileInputStream("someFile");
FileChannel fc = fis.getChannel();
FileLock fl = fc.lock(); // or tryLock(), or etc
// do stuff
fl.release();
可以使用ReadWriteLock。 Basicly它的工作原理是這樣的:
當讀取文件中使用的代碼塊:
Lock l = readwriteLock.readLock();
l.lock();
try {
// access the xml
} finally {
l.unlock();
}
寫作時使用此:
Lock l = readwriteLock.writeLock();
l.lock();
try {
// access the xml
} finally {
l.unlock();
}
多個線程可以同時讀取文件。只有一個線程可以同時寫入。 每當您在讀鎖上調用l.lock()時,它都會檢查寫鎖是否當前被鎖定。如果是,它將等待writelock上的unlock()。
每當您在寫入鎖上調用l.lock()時,它都會檢查是否有一個(或多個)當前鎖定的readlock。如果是這樣,它等待所有的鎖被解鎖。
這樣,當另一個線程正在讀取時,你永遠不會寫入。而且,當另一個線程正在寫入時(但是同時從多個線程讀取正在工作),您永遠無法讀取它。
的[使用Java(或:對網絡層ReadWriteLock中)中的共享文件夾同步HOWTO文件訪問]可能重複(http://stackoverflow.com/questions/320159/ howto-synchronize-file-access-in-a-shared-folder-using-java-or-readwritelock-on) – dogbane 2011-02-08 12:37:21
嗯,這個問題似乎比我的更復雜。在我的情況下,它是讀取/寫入XML文件的同一個應用程序。所有事情都是在本地完成的,以便通過不同的虛擬機或網絡 – FloweN 2011-02-08 13:00:50