Java I / O PrintStream的线程安全性

时间:2014-02-07 21:24:04

标签: java io thread-safety

我有使用PrintStream打印到文件的代码。每个线程产生自己的PrintStream版本。我知道通常操作系统(在我的情况下是linux)锁定文件以获得写入权限。这是java中的情况吗?或者换句话说,以下代码线程是否安全?

private void writeToFile(String data) {
    File file = new File("/file.out");
    try {
        if (!file.exists()) {
            //if file doesnt exist, create it
            file.createNewFile();
        }
        PrintStream out = new PrintStream(new FileOutputStream(file, true));
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date();
        out.println(dateFormat.format(date) + " " + data);

        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
} 

在你回答之前,你可以做一些假设:

  1. 无法限制为一个PrintStream。请假设它有多个实例,并且不能改变。同样,这一方法无法同步。我不想要只是说“同步你的​​代码”的答案。

  2. 如果操作系统确实将文件锁定为写入权限,则会在写入请求或实例化File时将其锁定。换句话说,在完成写入或调用out.close()时是否释放锁定?

1 个答案:

答案 0 :(得分:0)

在Linux上,多个进程可以同时写入文件。默认情况下没有锁定,并且应用程序层中的缓冲可能会产生不可预测的结果。

在Windows上,可以使用共享模式打开文件,该模式允许其他进程同时打开文件进行写入。在CreateFile Windows API函数中打开文件时,将设置“锁定”。如果我没记错,Java默认使用此模式,这样两个进程就可以同时打开一个文件进行写入。

使用文件锁定API获得可预测的,与平台无关的结果。