gpt4 book ai didi

java - map 对象同步

转载 作者:行者123 更新时间:2023-12-01 23:25:53 24 4
gpt4 key购买 nike

我有一个 Map 对象,它对应于存储在文件中的键值对。

private static Map myMap;

此 Map 对象有一个管理器类,它有一个 getMap() 方法,该方法将对象返回给调用者。

public static Map getMap() 

它还有一个同步方法 saveMap() 将内容保存回文件

public static synchronized void saveMap(Map map)

问题是,有些线程获取了 Map 对象但不想保存,即它们不调用 saveMap()。

假设thread1获取map对象并对其进行修改,即向map添加一个键值对。 key1=value1,任务完成后,从 map 中删除此键值对。中间有另一个线程thread2,它将另一个键值对添加到映射key2=value2,并在thread1实际删除之前保存它>key1 从 map 上。这会导致 key1=value1 和 key2=value2 都保存到文件中。这不是我想要的。

我该如何克服这种情况?我正在考虑用类似的东西修改 getMap() 方法

public Map getMap(boolean readonly) {
if (readonly)
return myMap.clone();
return myMap;
}

这能解决我的问题吗?

注意:我不想使用互斥锁并锁定 Map 对象,因为我有长时间运行的进程,这会阻塞其他线程。

最佳答案

我会做两件事之一。

第一个,也是我推荐的,是不要分发 map 的副本。除了不使用同步对象导致的多线程问题之外,无法确保值不会因交错获取/保存而丢失/覆盖。

在您的管理器类中,删除了 getMap() 和 saveMap(),并将其替换为 getValue() 和 setValue()。我将使这些方法同步,或者将 Map 替换为 ConcurrentMap 。这样就不会有人持有整个 map 的实例。

第二个选项是将 map 替换为 Hashtable 。它是同步且线程安全的,但速度较慢。这会解决你的一些问题,但不是全部。您仍然对代码周围运行的 map 有松散的引用。

关于java - map 对象同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20015749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com