Hashtable:如何使用2/3不同的线程?

时间:2015-05-15 13:56:32

标签: android multithreading synchronization hashtable concurrenthashmap

在android上我有一个哈希表和两个可以访问它的线程。 - 使用containsKey,get和put进行UI线程访问 - 使用containsKey,get和put以及迭代器

访问其他线程

我知道哈希表是线程安全的,但确定吗?

我不明白的一件事: 如果一个线程没有看到一个值已从哈希表中删除并且线程在该对象上迭代,那么为什么应用程序不会爆炸?

如果迭代器不是,我们如何定义哈希表线程安全?

编辑 :但现在我以更具体的方式告诉你我的问题,因为其他方式我不清楚。 以下是我的concurrentHashMap的代码:

public ConcurrentHashMap<String,Result> Holder = new ConcurrentHashMap<String,Result>();

class Result
{
    public float goal = 0;
    public float min = 0;
    public float max = 0;
    public float seconds = 0;
    //lastaccess indicate the time of the last access of this Result
    public float lastaccess = 0;
    public boolean triggered = false;
}

现在一个主题B 迭代每个&#34; x&#34;将结果对象和存储在持有人 ConcurretHashMap中的每个密钥加秒。

其他主题为新密钥设置新的结果,或者为现有密钥编辑结果

  • 我想以原子方式执行更新Result的操作,但是hashmap中的对象让我感到害怕。

  • UX线程每隔x秒从持有人中删除所有项目。要以这种方式执行此操作: 我创建了一个

    对象mlock = new Object();

主题B

中的

 syncrhonized(mlock)
    {
       //all the thread B function. 
       // Iterate on all of the Holder item
    }

在另一个线程C中必须调用Holder.clear() 我这样做了:

syncronized(mlock)
{
   Holder.clear();
}
  • 是否有正确的方法可以防止线程B在持有者上使用不一致的数据进行迭代?

1 个答案:

答案 0 :(得分:1)

它是线程安全的,但在高并发情况下,建议您使用ConcurrentHashMapofficial documentation