从多个线程写入文本文件?

Mar*_*eli 5 java multithreading

我有20个线程用println()函数写入一个名为results.txt的文件.我怎样才能同步它们?

我注意到每次运行程序时,我在results.txt中都有不同数量的文本行.

谢谢.

小智 23

通过包含要写入文件的synchronized方法的类访问该文件.一次只能有一个线程执行该方法.

我认为Singleton模式适合您的问题:

package com.test.singleton;

public class Singleton {
    private static final Singleton inst= new Singleton();

    private Singleton() {
        super();
    }

    public synchronized void writeToFile(String str) {
        // Do whatever
    }

    public Singleton getInstance() {
        return inst;
    }

}
Run Code Online (Sandbox Code Playgroud)

每次需要写入文件时,您只需要拨打:

Singleton.getInstance().writeToFile("Hello!!");
Run Code Online (Sandbox Code Playgroud)

  • getInstance()方法需要是静态的 (8认同)
  • 我会用'enum`作为单身人士. (4认同)
  • +1简单但有效.但是,"a*class*"应该是"an*object*"(从具有所述同步方法的类实例化),因为`synchronized`方法只是每个对象的互斥. (2认同)
  • @MarcoMicheli这个答案的关键点是:[`synchronized`](http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html) (2认同)
  • (从技术上讲,[静态方法也可以同步](http://stackoverflow.com/questions/578904/how-do-synchronized-static-methods-work-in-java),但使用静态方法!) (2认同)

Old*_*eon 7

重复的问题......重复的答案.正如我在这里所说:

如果您可以将文件保存为FileOutputStream,则可以将其锁定为:

FileOutputStream file = ...
....
// Thread safe version.
void write(byte[] bytes) {
  try {
    boolean written = false;
    do {
      try {
        // Lock it!
        FileLock lock = file.getChannel().lock();
        try {
          // Write the bytes.
          file.write(bytes);
          written = true;
        } finally {
          // Release the lock.
          lock.release();
        }
      } catch ( OverlappingFileLockException ofle ) {
        try {
          // Wait a bit
          Thread.sleep(0);
        } catch (InterruptedException ex) {
          throw new InterruptedIOException ("Interrupted waiting for a file lock.");
        }
      }
    } while (!written);
  } catch (IOException ex) {
    log.warn("Failed to lock " + fileName, ex);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 来自 FileLock 的 JavaDoc:“文件锁代表整个 Java 虚拟机持有。它们不适合控制同一虚拟机内的多个线程对文件的访问。” (2认同)
  • 多个线程可以安全地使用获取的FileLock对象,但是此锁不适用于控制多个线程对文件的访问。即-对象(FileLock)本身是线程安全的。但是,不应像您描述的那样使用它。 (2认同)