ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

複数プロセスから同一ファイルに同時書き込み

こないだ問題になった件。となりの同僚の人が書いた再現プログラムを脳内で再現する。

import java.io.*;

public class test
{
	public static void main(String[] args) throws IOException
	{
		PrintWriter writer = new PrintWriter(new FileWriter("aaa.txt"));
		PrintWriter writer2 = new PrintWriter(new FileWriter("aaa.txt"));

		writer.println("writerから1回目の書き込み。");
		writer.flush();
		writer2.println("writer2から1回目の書き込み。");
		writer2.flush();

		writer2.println("writer2から2回目の書き込み。");
		writer2.flush();
		writer.println("writerから2回目の書き込み。");
		writer.flush();

		writer.close();
		writer2.close();
	}
}

プログラム実行後、aaa.txtの内容はこうなる。

writer2から1回目の書き込み。
writerから2回目の書き込み。

というわけで、複数プロセスから同一ファイルに同時書き込みすると、
内容が混ざったファイルが出来上がる可能性があるということ。
BufferedWriterとか使うと、内部的にflushが行われるので、
再現させるのはかなり難しいかも。
そんな設計にしてはいけませんというのが結論ですね。