问题: 我有一个ViewModel基类,其中有一个HashMap来存储ViewModel的属性值。然而,我遇到了一个间歇性的错误,在向该集合添加项后,从该集合中读取(在另一个线程上)会直接返回null。
private HashMap<String, Serializable> _propertyValues = new HashMap<String, Serializable>();
一个例子:当提供用户ID时,我想获取用户信息。
ViewModel将UserID连接到PropertyChanged。属性更改处理程序创建一个后台线程来拉取值。后台线程读取UserID,然后从服务器获取。
我们看到,在某些罕见情况下,后台线程从属性哈希映射中读取null(线程2),直接在提供值后(线程1)。
我的想法:我怀疑这是由于data visibility和缺乏线程安全集合所致。当审查线程安全选项时,我遇到了以下内容:
- Hashtable-社区认为这已经过时,并且不鼓励使用。
- ConcurrentHashMap-似乎我仍然可能会遇到由于它缺乏可靠的同步而导致的问题
- Collections.synchronizedMap(map)-似乎在使用方式上很特别,不确定它是否比Hashtable有优势
此时,我觉得Hashtable是我想要的,但需要确认。 :)
用例:
- 每分钟一次左右的100次读取。
- UI线程频繁写入。
- 后台线程定期读取需要准确值的数据。在UI线程写入后,后台线程立即读取。
谢谢, Trey
synchronizedMap(new HashMap())
的优点在于,HashMap
在过去十年中得到了发展,而Hashtable
没有。 - Marko TopolnikExecutors.newSingleThreadExecutor()
像一个Queue
一样。这样,只有一个线程在执行,如果读线程在写线程之后提交,你可以保证读线程已经完成。但这可能会导致性能下降。 - JeshurunHashtable
共享的陷阱)。这就是为什么我认为相比之下,Hashtable
没有太多可提供的原因。 - Marko Topolnik