在序列化之前锁定Java对象

在序列化之前锁定Java对象,java,serialization,Java,Serialization,如果我有一个带有两个实例变量的简单Java对象: class SerializeMe implements Serializable{ private Foo foo; private Bar bar; } 如果Foo和Bar类实现了可序列化的接口,我就可以开始了。但我的问题是,如果我正在序列化这个类SerializeMe,那么在多线程环境中,foo或bar变量的状态在序列化过程中不很可能发生变化吗 如何确保父类的整体状态在序列化期间不会更改 在要序列化的对象上创建锁的最佳方法是什么?序列

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

class SerializeMe implements Serializable{

private Foo foo;
private Bar bar;

}
如果
Foo
Bar
类实现了可序列化的接口,我就可以开始了。但我的问题是,如果我正在序列化这个类
SerializeMe
,那么在多线程环境中,
foo
bar
变量的状态在序列化过程中不很可能发生变化吗

如何确保父类的整体状态在序列化期间不会更改


在要序列化的对象上创建锁的最佳方法是什么?

序列化不是线程安全的

你可以

synchronize(object){
 serialize(object)
}
但是,如果任何其他线程已经有对Foo或bar的引用,它们可以修改它

如果需要修改类的序列化,则需要实现void writeObject(ObjectOutputStream)

这是我的头,所以请测试它


[编辑]正如Peter Lawrey指出的,它是同步的

答案是肯定的,在序列化过程中状态很可能会发生变化。如果您还有问题,请查看并告知我们。是的,这是很有可能的,而且它不是线程安全的。最好的方法是不要尝试序列化可能要进行并发修改的对象。序列化通常应该在应用程序流中定义良好的点上执行,而不是在任何时候。我认为您指的是
synchronized
,而不是
synchronized
private synchronized void writeObject(ObjectOutputStream out) throws IOException {
  synchronized(foo){
    synchronized(bar){
      out.defaultWriteObject();
}
}
}