在序列化之前锁定 Java 对象

Putting lock on Java object before serialization

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

class SerializeMe implements Serializable{

private Foo foo;
private Bar bar;

}

如果 FooBar classes 实现了 Serializable 接口,我就可以开始了。但是我的问题是,如果我在序列化这个 class SerializeMe 的过程中,在多线程环境中, foo 或 [= 的状态不是很可能吗? 16=] 变量可能会在序列化过程中发生变化?

如何确保父级 class SerializeMe 的整体状态在序列化期间不会改变?

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

序列化不是线程安全的。

你可以

synchronize(object){
 serialize(object)
}

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

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

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

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

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