在序列化之前锁定 Java 对象
Putting lock on Java object before serialization
如果我有一个带有两个实例变量的简单 Java 对象:
class SerializeMe implements Serializable{
private Foo foo;
private Bar bar;
}
如果 Foo
和 Bar
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 所说,它是同步的
如果我有一个带有两个实例变量的简单 Java 对象:
class SerializeMe implements Serializable{
private Foo foo;
private Bar bar;
}
如果 Foo
和 Bar
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 所说,它是同步的