我创建了这个方法来通过多个线程将文本写入同一文件:
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/