ObjectOutputStream.writeObject 对文件线程安全吗?

Is ObjectOutputStream.writeObject to a file thread safe?

我正在开发一个应用程序,该应用程序必须将对象序列化为一个文件供以后使用。有多个线程同时调用方法writeObject(对于不同的对象,同一个文件)。该方法是线程安全的吗?我必须在应用程序代码中同步写入操作吗?

例如:线程1序列化对象A,线程2序列化对象B,如果我不同步,A和B会不会在文件中混在一起?谢谢!

视情况而定。如果他们正在写入同一个文件,那么是的,这应该是同步的。但这通常即使在对象序列化之外也是如此:如果您有两个或多个线程写入同一个流,则它们需要同步。

如果他们每个人都在写自己的streams/files,那么你就没有资源冲突,而且它是线程安全的

首先,Java序列化is dangerous所以应该避免。

不,ObjectOutputStream 不是 线程安全的 。 API 似乎没有对此做出任何声明。也可以查看源码,这里为了安全只有thread-safety。

它不是 thread-hostile 所以你可以同时写入两个独立的 ObjectOutputStreams。

来自 java.nio.file.Files.newOutputStream​

OutputStream 线程安全的 但不会自动授予 "decorators".

Writers 有一些明确的锁定,但绝对是猪耳朵。

如果多个线程正在写入同一个文件,您必须同步写入方法,因为 ObjectOutputStream 不是开箱即用的线程安全的。您最终可能会得到混淆的结果和不同类型的线程问题。