Java ObjectOutputStream.writeObject是线程安全的文件吗?
我正在开发一个应用程序,该应用程序必须将对象序列化到一个文件中,以便以后使用。有多个线程同时调用方法Java ObjectOutputStream.writeObject是线程安全的文件吗?,java,multithreading,serialization,concurrency,objectoutputstream,Java,Multithreading,Serialization,Concurrency,Objectoutputstream,我正在开发一个应用程序,该应用程序必须将对象序列化到一个文件中,以便以后使用。有多个线程同时调用方法writeObject(对于不同的对象,相同的文件)。该方法是线程安全的吗?我必须在应用程序代码中同步写入操作吗 例如:线程1序列化对象A,线程2序列化对象B。如果我没有同步它们,A和B会在文件中相互混淆吗?谢谢 视情况而定。如果它们正在写入同一个文件,那么是的,这应该是同步的。但即使在对象序列化之外,这通常也是正确的:如果有两个或多个线程写入同一个流,那么它们需要同步 如果他们每个人都在写自己的
writeObject
(对于不同的对象,相同的文件)。该方法是线程安全的吗?我必须在应用程序代码中同步写入操作吗
例如:线程1序列化对象A,线程2序列化对象B。如果我没有同步它们,A和B会在文件中相互混淆吗?谢谢 视情况而定。如果它们正在写入同一个文件,那么是的,这应该是同步的。但即使在对象序列化之外,这通常也是正确的:如果有两个或多个线程写入同一个流,那么它们需要同步
如果他们每个人都在写自己的流/文件,那么就不会有资源冲突,这将是线程安全的首先是Java序列化,所以应该避免 否,
ObjectOutputStream
不是线程安全的。API似乎没有对此做出任何声明。您还可以检查源代码,其中只有线程安全性
它不是线程敌对的,因此您可以同时写入两个独立的ObjectOutputStream
s
OutputStream
s fromjava.nio.file.Files.newOutputStream代码>是线程安全的,但不会自动授予“装饰器”
Writer
s有一些显式锁定,但绝对不会锁定。如果多个线程正在写入同一个文件,则必须同步写入方法,因为ObjectOutputStream
不是现成的线程安全。您可能最终会遇到mixedup结果和不同类型的线程问题。如果有两个或多个线程写入同一个流,同步将无助于消除您的设计缺陷。@Kayaman我使用(至少尝试使用)的术语“同步”比其关键字“Java定义”更抽象。例如,使用一个只有一个写入线程的队列进行同步。目前还不清楚,这可能会给人一种印象,即流是一种与集合类似的可共享资源,只要它是线程安全的。即使此方法是线程安全的,对象也会以随机顺序写入文件。你同意吗?@AlexeiKaigorodov是的,顺序无关紧要。Java序列化很危险。。。什么是更好的选择?