2 回答

TA貢獻1783條經(jīng)驗 獲得超4個贊
你的synchronized
塊不會做任何事情;這不是線程安全的。
同步基于每個實例:synchronized (writer)
意味著沒有其他監(jiān)視器可以在同一個writer
實例上進入同步塊。但是你只是在你的方法中創(chuàng)建了那個 writer,你從來沒有將它發(fā)布到另一個線程;沒有其他線程會看到該對象,更不用說嘗試在其上輸入同步塊了。
您需要創(chuàng)建類似于從文件路徑到要鎖定的對象的靜態(tài)映射(并注意別名等,它們可能具有不同的路徑但引用同一個文件)。當然,這些都不會阻止另一個進程寫入文件。
文件的原子性很棘手。一種常見的技術是寫入一個臨時的隨機文件,然后將該文件移動到目標路徑。

TA貢獻1789條經(jīng)驗 獲得超8個贊
您可以通過不使用writer變量而是使用另一個static變量進行同步來實現(xiàn)它。這樣,調(diào)用此方法的所有對象都將使用相同的對象進行同步,而不是每次調(diào)用創(chuàng)建的新 BufferedWriter。
例子:
public class SyncExample{
private static Object lock = new Object(); // the object for locks does not have to be anything special.
public static void ThreadsafeWriter(String text, String file) throws IOException {
String nodeValue = text;
BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
synchronized (lock ) {
String[] words = nodeValue.split(" ");
for (String word: words) {
writer.write(word);
writer.newLine();
}
writer.close();
}
}
}
編輯:我剛剛重新閱讀了您的問題,抱歉。如果您嘗試寫入的文件在調(diào)用之間相同或不同,請考慮我的“修復”確實會忽略。它只是“不可能”“同時”寫入兩個任何文件。
添加回答
舉報