第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

線程安全寫入同一文件

線程安全寫入同一文件

瀟湘沐 2021-09-03 21:59:15
我創(chuàng)建了這個方法來通過多個線程將文本寫入同一個文件:public static void ThreadsafeWriter(String text, String file) throws IOException {    String nodeValue = text;    BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));    synchronized (writer) {        String[] words = nodeValue.split(" ");        for (String word: words) {            writer.write(word);            writer.newLine();        }        writer.close();    }}我想問一下有沒有錯誤,會不會導致異常?
查看完整描述

2 回答

?
慕娘9325324

TA貢獻1783條經(jīng)驗 獲得超4個贊

你的synchronized塊不會做任何事情;這不是線程安全的。

同步基于每個實例:synchronized (writer)意味著沒有其他監(jiān)視器可以在同一個writer實例上進入同步塊。但是你只是在你的方法中創(chuàng)建了那個 writer,你從來沒有將它發(fā)布到另一個線程;沒有其他線程會看到該對象,更不用說嘗試在其上輸入同步塊了。

您需要創(chuàng)建類似于從文件路徑到要鎖定的對象的靜態(tài)映射(并注意別名等,它們可能具有不同的路徑但引用同一個文件)。當然,這些都不會阻止另一個進程寫入文件。

文件的原子性很棘手。一種常見的技術是寫入一個臨時的隨機文件,然后將該文件移動到目標路徑。


查看完整回答
反對 回復 2021-09-03
?
拉丁的傳說

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)用之間相同或不同,請考慮我的“修復”確實會忽略。它只是“不可能”“同時”寫入兩個任何文件。

查看完整回答
反對 回復 2021-09-03
  • 2 回答
  • 0 關注
  • 179 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號