线程之间的共享哈希映射

时间:2012-07-23 05:00:15

标签: java multithreading thread-safety

我有一个班级

class A {
  private static HashMap hash;
  public static void setHash(HashMap hash)
  {
    this.hash=hash;
  }
  public static HashMap getHash()
  {
    return hash;
  }
}

我有两个主题是线程A和线程B

public class ThreadA implements Runnable
{
  private HashMap hash;
  public ThreadA(HashMap hash)
  {
    this.hash = hash
  }
}

同样,对于ThreadB

在大班我做以下

main()
{
  // inserted some values in hashmap 
  Thread t1 = new Thread(new ThreadA(hash));
  Thread t2 = new Thread(new ThreadB(hash));
}

另一个线程C使用hash的setter方法来更改hashmap。新值未反映在线程A和B中。 可能是什么问题呢? 谢谢!

3 个答案:

答案 0 :(得分:1)

ThreadA anf ThreadB在其构造函数中都收到HashMap,而不是类A的对象。

即使您稍后更改了类hash的对象的A属性,也不会更改两个线程已经收到并存储的HashMap引用。

如果您想确保两个线程都可以访问新的HashMap,您必须提供对它们的新引用(因此您需要在ThreadA中创建一个setter方法,并在某处存储对ThreadA对象的引用,以便稍后调用setter),或直接传递类A的对象。

答案 1 :(得分:0)

已经很晚了,而且是星期天......但是你不需要使用静态类吗?

我很确定会解决它......

答案 2 :(得分:0)

我这样理解你的问题。
你有以下的事情......

  • class A {static HashMap hash,getter and setter}
  • ThreadA {HashMap hash,ThreadA(HashMap hash){this.hash = hash}}
  • ThreadB ..等等
  • ThreadC {...一些设置类A的哈希}并且它没有反映在ThreadA和ThreadB中。

如果这是你的问题,那是因为ThreadA和B已经通过构造函数获得了哈希引用并对其进行了处理,在ThreadC中设置类A的哈希不会影响已经设置的ThreadA和B的哈希值。

考虑您遵循这些步骤

  1. 创建一个哈希 - 假设它指的是地址1001
  2. 传递给threadA和threadB,以便它们具有引用1001的哈希
  3. 在threadC中创建了另一个哈希 - 假设它指的是2001
  4. 将ThreadC创建的哈希设置为A类。即,现在A类哈希引用2001,仍然ThreadA和ThreadB保持哈希,引用1001,就是这样
  5. 考虑这个解决方案

    首先,在类A中删除静态关键字并使'hash'实例变量而不是类变量(我不确定你为什么这样做)并将类A对象传递给threadA和threadB而不是hash

    • A类{HashMap哈希,getter和setter}
    • ThreadA {A obj,

      ThreadA(A obj)

      {this.obj = obj} ..

      //使用classAobj.getHash()的getter访问哈希并使用哈希映射继续处理

      }

    • ThreadB ..等等