从两个线程写入一个文件会产生意外结果

时间:2013-08-29 11:55:00

标签: java

当我运行此测试时

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

为什么会这样?

2 个答案:

答案 0 :(得分:6)

中间缓冲区。通常现代OS缓冲文件写入一次写入完整扇区,以避免过多的硬盘驱动器头搜索,允许使用DMA技术等...

答案 1 :(得分:0)

这可能是 ASYNC I / O Write 的一个例子。

内核更新页面缓存中相应的进程(不同)页面并将其标记为脏(需要在HDD中更新)。然后控件快速返回到相应的进程(这里有2个不同的进程),这些进程可以按照调度程序调用的顺序继续在控制台中运行和更新。稍后以更优化的方式(顺序聚合写入)以更优的时间(低CPU负载)将数据刷新到HDD。因此顺序从过程区域写入。