JAVA序列化高度易失性对象集合的安全方法?
这是以下问题: 假设我有一个总是由多个线程作用的对象集合JAVA序列化高度易失性对象集合的安全方法?,java,serialization,synchronization,Java,Serialization,Synchronization,这是以下问题: 假设我有一个总是由多个线程作用的对象集合 public class AlwaysChanging implements Serializable { // ... state ... public synchronized void updateFromThread1( int data ) { /* ... */ } public synchronized void updateFromThread2( int data ) { /* ... */ }
public class AlwaysChanging implements Serializable {
// ... state ...
public synchronized void updateFromThread1( int data ) { /* ... */ }
public synchronized void updateFromThread2( int data ) { /* ... */ }
}
序列化
集合的安全方法是什么?首先,为什么对不同的线程有不同的更新方法?这似乎是杂乱无章的
要序列化集合,您需要确保在序列化过程中,AlwaysChanging
中没有任何内容发生更改。从这个设计来看,唯一的方法似乎是在序列化之前持有它们的所有锁。或者,您可以创建整个集合的深度副本(复制所有对象)并将其序列化
在不太了解应用程序其余部分的情况下,我建议您研究一种更细粒度的锁定解决方案。唯一安全的方法是在序列化集合时将其设置为只读
同步机制将无法工作,因为您无法轻松地对所有对象(对某些同步块whilesynchronizing()方法)运行方法调用,然后执行序列化
将同步方法重写为在执行器中提交条目可能更容易,因为这样可以控制实际执行的机制。默认同步方法是否足够?既然更新方法是同步的,为什么不用同步来覆盖默认的序列化机制呢
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
lock(this) {
ois.defaultReadObject();
}
}
private void writeObject(ObjectOutputStream oos) throws ClassNotFoundException, IOException {
lock(this) {
oos.defaultWriteObject();
}
}
ReadWriteLock
如果访问模式主要是写模式,则不会有多大帮助,如图所示。有多个数据源通过接口从不同线程推送数据(它们实际上不被称为updateFromThreadX
:-)。每个AlwaysChanging
对象都是这些数据源的订户,并且一次受到多个线程的操作AlwaysCharging
本质上是事件驱动的;唯一的其他设计考虑可能是对传入数据进行队列化(但这可能不可能,而且这并不能解决序列化问题)。