java - 线程安全写入同一文件

标签 java multithreading

我创建了这个方法来通过多个线程将文本写入同一文件:

public static void ThreadsafeWriter(String text, String file) throws IOException {
    String nodeValue = text;
    BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
    synchronized (writer) {
        String[] words = nodeValue.split(" ");
        for (String word: words) {
            writer.write(word);
            writer.newLine();
        }
        writer.close();
    }
}

我想问一下有没有错误,会不会导致异常?

谢谢!

最佳答案

你的synchronized block 不会做任何事情;这不是线程安全的。

同步是基于每个实例的:同步(写入器) 意味着没有其他监视器可以在同一个完全相同的写入器 实例上输入同步块(synchronized block)。但是您只是在您的方法中创建了该编写器,并且从未将其发布到另一个线程;其他线程都不会看到该对象,更不用说尝试在其上输入同步块(synchronized block)了。

您需要创建类似从文件路径到要锁定的对象的静态映射之类的内容(并注意别名等,它们可能具有不同的路径,但引用同一文件)。当然,这些都不会阻止另一个进程写入该文件。

文件的原子性很棘手。一种常见的技术是写入临时随机文件,然后将该文件移动到目标路径。

关于java - 线程安全写入同一文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52229369/

相关文章:

java - JPEG如何在解码文件流时跳过用户定义的标签

Java多线程切换上下文VS提交新任务以及监控队列的解决方案

java - Spring Boot 共享线程

c++ - 在 C++ 线程中嵌套函数调用

java - 如何在sqlite android中通过搜索单词的首字母获取所有数据?

java - 自动隐藏任务栏和最大屏幕空间

java - 调用 Applet 方法 - Firefox 12 错误

java - joda 时区 id 与 java 时区 id 相同吗?

java - Java异步文件写入PipedOutputStream/PipedInputStream(或Reader/Writer)与BlockingQueue的异同

java - 从不同线程更新对象