如何使列表线程安全以进行序列化?
How to make a list thread-safe for serialization?
我正在使用 ThreadSafeList,并且我从中获得了很大的好处,可以将数据从进程流式传输到网络服务器,然后在数据进入客户端时将数据流式传输回来。在内存中,我使用 Spring 缓存(引擎盖下的 ehcache)将数据保存在 JVM 中,一切都很好。当我开始达到堆限制并且 Spring 缓存在我使用它时开始将我的 ThreadSafeList 序列化到磁盘时,问题就开始了,导致 ConcurrentModificationExceptions。是否可以覆盖Serialization接口的私有writeObject和readObject方法来解决问题?我不确定该怎么做,或者我是否应该放弃我的 ThreadSafeList。
当我开始这个程序时,我使用的是 BlockingDeque,但这还不够,因为当我放置和采用该结构时,我不记得要缓存的数据...我不能使用ConcurrentMap 因为我需要在我的列表中排序...我应该使用 ConcurrentNavigableMap 吗?我觉得自己使用 ThreadSafeList 和自定义私有序列化函数可能是一种浪费?
Collections.synchronizedList()
将使任何 List 线程安全并支持序列化(如果底层列表是可序列化的)。如果你需要迭代它,记得在列表上同步。
例如
@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;
}
我正在使用 ThreadSafeList,并且我从中获得了很大的好处,可以将数据从进程流式传输到网络服务器,然后在数据进入客户端时将数据流式传输回来。在内存中,我使用 Spring 缓存(引擎盖下的 ehcache)将数据保存在 JVM 中,一切都很好。当我开始达到堆限制并且 Spring 缓存在我使用它时开始将我的 ThreadSafeList 序列化到磁盘时,问题就开始了,导致 ConcurrentModificationExceptions。是否可以覆盖Serialization接口的私有writeObject和readObject方法来解决问题?我不确定该怎么做,或者我是否应该放弃我的 ThreadSafeList。
当我开始这个程序时,我使用的是 BlockingDeque,但这还不够,因为当我放置和采用该结构时,我不记得要缓存的数据...我不能使用ConcurrentMap 因为我需要在我的列表中排序...我应该使用 ConcurrentNavigableMap 吗?我觉得自己使用 ThreadSafeList 和自定义私有序列化函数可能是一种浪费?
Collections.synchronizedList()
将使任何 List 线程安全并支持序列化(如果底层列表是可序列化的)。如果你需要迭代它,记得在列表上同步。
例如
@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;
}