Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA序列化高度易失性对象集合的安全方法?_Java_Serialization_Synchronization - Fatal编程技术网

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
本质上是事件驱动的;唯一的其他设计考虑可能是对传入数据进行队列化(但这可能不可能,而且这并不能解决序列化问题)。