【问题标题】:Putting lock on Java object before serialization在序列化之前锁定 Java 对象
【发布时间】:2015-05-05 20:33:40
【问题描述】:

如果我有一个带有两个实例变量的简单 Java 对象:

class SerializeMe implements Serializable{

private Foo foo;
private Bar bar;

}

如果FooBar 类实现了Serializable 接口,我应该很高兴。但我的问题是,如果我正在序列化这个类SerializeMe,那么在多线程环境中foobar 变量的状态可能会在序列化过程中发生变化吗?发生?

如何保证父类SerializeMe的整体状态在序列化过程中不会改变?

在您希望序列化的对象上简单地创建一个锁是最好的方法吗?

【问题讨论】:

  • 答案是肯定的,在序列化过程中状态很可能会发生变化。看看stackoverflow.com/questions/3077703/…,如果您还有问题,请告诉我们。
  • 是的,这很有可能,而且它不是线程安全的。 stackoverflow.com/questions/8724082/…
  • 最好的办法是不要尝试序列化可能会被并发修改的对象。序列化通常应在应用程序流程中明确定义的点执行,而不是任何时候。

标签: java serialization


【解决方案1】:

序列化不是线程安全的。

你可以

synchronize(object){
 serialize(object)
}

但是如果任何其他线程已经引用了 Foo 或 bar 他们可以修改它。

如果你需要修改一个类的序列化你需要实现void writeObject(ObjectOutputStream)。

private synchronized void writeObject(ObjectOutputStream out) throws IOException {
  synchronized(foo){
    synchronized(bar){
      out.defaultWriteObject();
}
}
}

这是我的想法,所以请测试一下。

[编辑]正如 Peter Lawrey 所说,它是同步的

【讨论】:

  • 我想你的意思是synchronized而不是synchronize
猜你喜欢
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2018-11-02
  • 1970-01-01
相关资源
最近更新 更多