编程语言
首页 > 编程语言> > Java中PrintStream的线程安全性

Java中PrintStream的线程安全性

作者:互联网

我正在尝试写入文件.我需要能够“附加”到文件而不是覆盖它.另外,我需要它是线程安全和高效的.我目前拥有的代码是:

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();
    }
  }

一切都很好.我只是不知道PrintStream是否是线程安全的.因此,我的问题是:从多个PrintStream实例写入同一物理文件是否安全?如果是这样,它是否使用锁定(降低性能)或排队?
您是否知道任何本机Java库都是线程安全的并且使用队列?
如果没有,我写自己的书就没问题.我只是想先看看是否有任何本机,然后再写自己的东西.

解决方法:

PrintStream源表明它是线程安全的.

如果要从不同的线程写入同一文件,为什么不跨线程共享同一PrintStream实例? PrintStream为您完成同步.

/**
 * Prints a String and then terminate the line.  This method behaves as
 * though it invokes <code>{@link #print(String)}</code> and then
 * <code>{@link #println()}</code>.
 *
 * @param x  The <code>String</code> to be printed.
 */
public void println(String x) {
    synchronized (this) {
        print(x);
        newLine();
    }
}

标签:thread-safety,printstream,java
来源: https://codeday.me/bug/20191122/2057391.html