[英]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.