我有一些通過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