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