Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ObjectOutputStream.writeObject是线程安全的文件吗?_Java_Multithreading_Serialization_Concurrency_Objectoutputstream - Fatal编程技术网

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 from
java.nio.file.Files.newOutputStream​是线程安全的,但不会自动授予“装饰器”


Writer
s有一些显式锁定,但绝对不会锁定。

如果多个线程正在写入同一个文件,则必须同步写入方法,因为
ObjectOutputStream
不是现成的线程安全。您可能最终会遇到mixedup结果和不同类型的线程问题。

如果有两个或多个线程写入同一个流,同步将无助于消除您的设计缺陷。@Kayaman我使用(至少尝试使用)的术语“同步”比其关键字“Java定义”更抽象。例如,使用一个只有一个写入线程的队列进行同步。目前还不清楚,这可能会给人一种印象,即流是一种与集合类似的可共享资源,只要它是线程安全的。即使此方法是线程安全的,对象也会以随机顺序写入文件。你同意吗?@AlexeiKaigorodov是的,顺序无关紧要。Java序列化很危险。。。什么是更好的选择?