簡體   English   中英

從兩個線程寫入一個文件會產生意外結果

[英]Writing to one file from two threads produces unexpected result

當我運行此測試時

public class Test extends Thread {
    String str;

    Test(String s) {
        this.str = s;
    }

    @Override
    public void run() {
        try {
            FileWriter fw = new FileWriter("1.txt", true);
            for (char c : str.toCharArray()) {
                System.out.print(c);
                fw.write(c);
            }
            fw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        new File("1.txt").delete();
        new Test("11111111111111111111").start();
        new Test("22222222222222222222").start();
    }
}

它確切顯示了如何將字符寫入1.txt

2222222222222222111211111211111121211111

但在1.txt中,我看到了不同的結果

2222222222222222222211111111111111111111

這是為什么?

中間緩沖區。 通常,現代OS緩沖區文件寫入會立即寫入完整的扇區,以避免過多的硬盤頭搜索,允許使用DMA技術等。

這可能是ASYNC I / O Write的示例。

內核會更新頁面緩存中的相應進程(不同)頁面,並將其標記為臟(需要在HDD中進行更新)。 然后,控件快速返回到相應的進程(此處為2個不同的進程),該進程可以按照調度程序調用的順序繼續在控制台中運行和更新。 稍后,以更佳的方式(順序成束的寫入)在更佳的時間(低cpu負載)將數據刷新到HDD。 因此從處理區順序寫入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM