Джава.Безопасные способы сериализации коллекций крайне изменчивых объектов? - PullRequest
0 голосов
/ 20 июня 2010

Это дополнительный вопрос к: Java. Сериализация объектов в многопоточной среде .

Предположим, у меня есть коллекция объектов, на которые всегда действуют несколько потоков.

public class AlwaysChanging implements Serializable {
    // ... state ...

    public synchronized void updateFromThread1( int data ) { /* ... */ }
    public synchronized void updateFromThread2( int data ) { /* ... */ }

}

Какой безопасный способ сериализации Collection<AlwaysChanging>?

Ответы [ 3 ]

2 голосов
/ 20 июня 2010

Прежде всего, почему у вас разные методы обновления для разных потоков? Это кажется грязным и нерастяжимым.

Чтобы сериализовать коллекцию, вам нужно убедиться, что ни один из ваших AlwaysChanging не изменяется во время сериализации. Исходя из этого, кажется, что единственный способ сделать это - сохранить все свои блокировки до сериализации. Кроме того, вы можете сделать полную копию всей коллекции (скопировать все объекты) и сериализовать ее.

Не зная об остальной части вашего приложения, я бы порекомендовал рассмотреть ReadWriteLock как более тонкое решение блокировки.

0 голосов
/ 20 июня 2010

Достаточны ли методы синхронизации по умолчанию?Поскольку ваши методы обновления синхронизированы, почему бы просто не переопределить механизм сериализации по умолчанию с синхронизацией?

 private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
      lock(this) {
        ois.defaultReadObject();
      }
    }

  private void writeObject(ObjectOutputStream oos) throws ClassNotFoundException, IOException {
      lock(this) {
        oos.defaultWriteObject();
      }
    }
0 голосов
/ 20 июня 2010

Единственный безопасный способ - сделать коллекцию доступной только для чтения при ее сериализации.

Синхронизированный механизм не будет работать, поскольку вы не можете легко выполнить вызов метода для всех объектов (для некоторого синхронизированного метода blockWhileSynchronizing ()) и ТОГДА выполняют сериализацию.

Может быть проще переписать ваши синхронизированные методы в отправку записей в Executor, поскольку это позволяет вам контролировать механизм, фактически выполняющий выполнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...