问题: 我有一个ViewModel基类,它有一个HashMap来存储ViewModel的属性值。但是我遇到了一个间歇性的错误,在这个错误中,从这个集合中读取(在一个单独的线程上)在添加一个项目后直接返回null。
private HashMap<String, Serializable> _propertyValues = new HashMap<String, Serializable>();
示例:我想在向ViewModel提供用户ID时获取用户信息。
ViewModel为UserID连接到PropertyChanged。属性更改处理程序创建一个后台线程来提取值。后台线程读取UserID,然后从服务器获取。
我们所看到的是,在极少数情况下,后台线程在提供值之后直接从属性hashmap(线程2)读取null(线程1)。
我的想法:我怀疑这是由于data visibility而没有线程安全集合。在查看线程安全选项时,我遇到了:
此时我觉得Hashtable是我想要的,但可以使用确认。 :)
用例:
谢谢, 特雷
答案 0 :(得分:4)
ConcurrentHashMap会做得很好。它具有内部同步以防止出现这些问题。它还有其他一些有用的方法,例如putIfAbsent
。
相对于Collections.synchronizedMap
的主要缺点是内存占用量更大。