如何保证多线程读写文件的安全?

我们看多个线程共用一个FileWriter写入同一个文件的情况:

在Writer抽象类里面有一个protected类型的lock属性,是一个简单Object对象。

JDK里对这个lock属性的描述如下:“用于同步针对此流的操作的对象。为了提高效率,字符流对象可以使用其自身以外的对象来保护关键部分。因此,子类应使用此字段中的对象,而不是 this 或者同步的方法。 ”——看来,多线程共用同一个writer的方案有戏。

FileWriter的JDK说明:“某些平台一次只允许一个 FileWriter(或其他文件写入对象)打开文件进行写入”

多个线程各自开启一个FileWriter写入同一个文件,会发生文本串行现象。

如何保证多线程读写文件的安全?_第1张图片

FileWriter在写入时,同步在了对应的FileOutputStream对象上——依此分析,多个线程共用一个FileWriter写入同一个文件,一次一行的情况下,不会出现串行。

FileWriter fw=new FileWriter(file);

线程内

WriteFileThread2 thread=new WriteFileThread2(fw,i);

没有出现任何串行现象。

 

BufferedWriter又如何呢?

按道理BufferedWriter只是把别的Writer装饰了一下,在底层写的时候也是同步的。

BufferedWriter.write和BufferedWriter.flushBuffer的方法同步在了被包装的Writer这个对象上。

也就是说,BufferedWriter.write和BufferedWriter.flushBuffer都有同步块包围,说明按上述环境测试时,是不会出现串行现象的。

 

结论:

1.可以开多个线程操作多个FileWriter写入同一个文件,多个FileWriter切换时,会导致相互交错,破坏字符串结构的完整性。

2.多个线程操作同一个FileWriter或者BufferedWriter时,每一次写入操作都是可以保证原子性的,也即:FileWriter或者BufferedWriter是线程安全的

3.由于第2条中的线程安全,写入速度下降超过一半。

你可能感兴趣的:(Java线程及进程)