Hashtable,ConcurrentHashMap和数据可见性

时间:2014-01-24 20:44:24

标签: java multithreading concurrency hashmap

问题: 我有一个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而没有线程安全集合。在查看线程安全选项时,我遇到了:

  1. Hashtable - 似乎社区认为这已过时并且不鼓励使用它。
  2. ConcurrentHashMap - 由于缺乏可靠的同步,我似乎仍然遇到了我的问题
  3. Collections.synchronizedMap(map) - 特别是你如何使用它,不确定它是否比Hashtable有好处
  4. 此时我觉得Hashtable是我想要的,但可以使用确认。 :)

    用例:

    1. 100ish每分钟读一次,每分钟左右。
    2. 来自UI线程的频繁写入
    3. 从需要准确值的后台线程中定期读取。在UI线程写入后立即读取后台线程。
    4. 谢谢, 特雷

1 个答案:

答案 0 :(得分:4)

ConcurrentHashMap会做得很好。它具有内部同步以防止出现这些问题。它还有其他一些有用的方法,例如putIfAbsent

相对于Collections.synchronizedMap的主要缺点是内存占用量更大。