6

Я использую ThreadSafeList, и я получаю большой пробег от него для потоковой передачи данных из процесса на веб-сервер, а затем потокового вывода данных, когда он приходит к клиенту. В памяти я сохраняю данные в JVM с помощью Spring Caching (ehcache под капотом), и все хорошо. Проблема началась, когда я начал нажимать на пределы кучи, а Spring Caching начал сериализацию моего ThreadSafeList на диск, пока я его использую, вызывая ConcurrentModificationExceptions. Могу ли я перезаписать частные методы writeObject и readObject для интерфейса Serialization для решения проблемы? Я не уверен, как это сделать, или если я должен отказаться от своего ThreadSafeList.Как сделать список потокобезопасным для сериализации?

Назад, когда я начал эту программу, я использовал BlockingDeque, но этого было недостаточно, потому что, когда я клал и принимал структуру, я не мог запомнить данные для кэширования ... Я не могу использовать ConcurrentMap потому что мне нужно заказать в моем списке ... я должен пойти на ConcurrentNavigableMap? Я чувствую, что катаюсь самостоятельно с помощью ThreadSafeList, и пользовательские функции сериализации могут быть ненужными?

Java Code Geeks ThreadSafeList

+0

Весеннее кэширование - это не такая вещь, если это поможет вам отследить, откуда эта проблема. –

ответ

1

Collections.synchronizedList() сделает любой список поточно-и поддерживает сериализацию (если базовый список Сериализуемый). Не забудьте синхронизировать в списке, если вам нужно перебирать его.

например.

@Cacheable 
public List<String> getData(String clientName) { 
    List<String> data = Collections.synchronizedList(new ArrayList<String>()); 
    // load data for the client from external process and add it to the list... 
    return data; 
}