我有一些通过RMI序列化并发访问的对象。最近我写了自定义的序列化方法:我是否需要同步writeObject()?
/** This method is made to omit serialization of this.order */
private void writeObject(java.io.ObjectOutputStream out)
throws java.io.IOException
{
Order tmpOrder = this.order;
this.order = null;
out.defaultWriteObject();
this.order = tmpOrder;
}
private void readObject(java.io.ObjectInputStream in)
throws java.io.IOException, ClassNotFoundException
{
in.defaultReadObject();
}
我不想允许通过并发RMI线程破坏this.order。
- 是否需要使writeObject同步?或
- RMI框架是否尽最大努力同步访问对象?
在第二种情况下,我的同步甚至可能导致RMI中的死锁。 JAVA API的一般契约是一个方法被一个线程调用,除非特别注明。所以如果我遵循规则,我应该离开writeObject
而不进行任何同步。它是否正确 ?
我的问题的另一个解决方案,而没有回答这个问题肯定宣布private static final ObjectStreamField[] serialPersistentFields
。 (我不能让现场瞬时因为对象不仅是DTO而是一个JPA实体也)
感谢您给我更多关于JAVA序列化API的详细信息:-)。所以我可以看到我在上面的代码snipset中没有什么可担心的。 ;-) – 2012-04-11 09:57:48
@digital_infinity你是否考虑过使用'order'瞬态,并且抛弃你的'readObject()'和'writeObject()'方法? – EJP 2012-04-11 10:06:50
是的,这就是为什么我写了我的问题的最后一段;-)。该对象由Hibernate使用,并且不能是暂时的(java关键字)。 – 2012-04-11 10:20:58