【问题标题】:Is ObjectOutputStream.writeObject to a file thread safe?ObjectOutputStream.writeObject 到文件线程是否安全?
【发布时间】:2020-07-14 14:57:12
【问题描述】:

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

例如:线程1序列化对象A,线程2序列化对象B。如果我不同步它们,A和B会在文件中相互混淆吗?谢谢!

【问题讨论】:

  • 即使此方法是线程安全的,对象也会以随机顺序写入文件。你还好吗?
  • @AlexeiKaigorodov 是的,顺序无关紧要。

标签: java multithreading serialization concurrency objectoutputstream


【解决方案1】:

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

不,ObjectOutputStream 不是线程安全的。 API 似乎没有对此提出任何声明。您还可以检查源代码,其中只有线程安全的安全性。

它不是 thread-hostile,因此您可以同时写入两个独立的 ObjectOutputStreams。

java.nio.file.Files.newOutputStream​ 中的OutputStreams 是线程安全的,但这不会自动授予“装饰器”。

Writers 有一些显式锁定,但绝对是猪耳朵。

【讨论】:

  • Java 序列化很危险...有什么更好的选择?
【解决方案2】:

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

如果他们每个人都写入自己的流/文件,那么你就没有资源冲突,它是线程安全的

【讨论】:

  • 如果您有两个或多个线程写入相同的流,同步将无助于您的设计缺陷。
  • @Kayaman 我正在使用(至少尝试使用)术语 同步 比它的关键字 Java 定义更抽象。例如,使用只有一个写入线程的队列进行同步。
  • 好吧。这不是很清楚,并且可能给人的印象是流是一种与集合类似的可共享资源,只要它是线程安全的。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 2023-03-24
    • 2019-11-21
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    相关资源
    最近更新 更多