2011-02-08 58 views
2

我正在尋找一種同步方法,以確保我的後端數據(xml文件)在多個客戶端訪問期間保持不變。xml文件的同步方法

我正在使用jaxb來讀寫文件。我想確保當客戶端讀取或寫入xml文件的信息時,沒有其他客戶端正在同時訪問它。

我已閱讀了關於ReadWriteLock並想知道這是否是最佳解決方案?顯然客戶端應該運行某種查詢來查看是否有任何內容正在寫入文件,如果不是,那麼繼續讀/寫?

我對java很陌生,原諒我的無知!

感謝

+1

的[使用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

+0

嗯,這個問題似乎比我的更復雜。在我的情況下,它是讀取/寫入XML文件的同一個應用程序。所有事情都是在本地完成的,以便通過不同的虛擬機或網絡 – FloweN 2011-02-08 13:00:50

回答

1

您的問題涉及到不同的「客戶端」 - 大概應用程序運行在不同的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(); 
1

可以使用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。如果是這樣,它等待所有的鎖被解鎖。

這樣,當另一個線程正在讀取時,你永遠不會寫入。而且,當另一個線程正在寫入時(但是同時從多個線程讀取正在工作),您永遠無法讀取它。