【发布时间】:2014-05-25 09:07:45
【问题描述】:
我有一个应用程序,它有一个 ConcurrentHashMap,它在本地存储存储在外部服务器上的数据副本。地图每隔几秒就会使用新的数据副本进行更新。
我有一个每隔几秒钟运行一次的循环,它可以访问 HashMap 并按值的顺序将元素添加到数组中(它实际上做得更多,但这无关紧要)。我的问题是,如果数据在创建数组的过程中发生变化,您可能在不同的地方有重复的键或完全遗漏了一些键。
例子:
// Map starts out like this
1 -> value1
2 -> value2
3 -> value3
4 -> value4
// First 2 elements of array created
value1,value2
// Map is updated
3 -> value3
1 -> value1
2 -> value2
4 -> value4
// Last 2 elements of array created
value1,value2,value1,value4
如您所见,如果地图未更改,则数组将为:“value1,value2,value3,value4”或“value2,value3,value1,value4”(如果在更新后运行)。
这是一些示例代码,它不是原始代码,但应该可以解释我的问题:
Map<Integer, String> mapThatGetsUpdated = new ConcurrentHashMap<Integer, String>();
String[] array = new String[mapThatGetsUpdated.size()];
for (int i = 0; i < mapThatGetsUpdated.size(); i++) {
array[i] = mapThatGetsUpdated.get(i);
}
这样做的明显方法是复制地图,然后在使用后将其丢弃,但我想要另一种方法,因为地图可能非常大,并且可能必须每秒复制几次。
【问题讨论】:
-
你可以在更新或读取哈希图时锁定(同步)它吗?
-
HashMap 不维护插入顺序。
-
@Braj 编辑了帖子以使其更加清晰,我正在使用数组中索引的键。
-
@immibis 我认为这可能会破坏
ConcurrentHashMap的目的?
标签: java multithreading