【问题标题】:Shared hashmap between threads线程间共享hashmap
【发布时间】:2012-07-23 05:00:14
【问题描述】:

我有课

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 中。 可能是什么问题呢? 谢谢!

【问题讨论】:

标签: java multithreading thread-safety


【解决方案1】:

ThreadAThreadB 在它们的构造函数中都接收到 HashMap,而不是 A 类的对象。

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

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

【讨论】:

    【解决方案2】:

    已经很晚了,现在是星期天...但是您不需要使用静态类吗?

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

    【讨论】:

    【解决方案3】:

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

    • A 类 {静态 HashMap 哈希、getter 和 setter}
    • ThreadA {HashMap hash, ThreadA(HashMap hash){this.hash = hash}}
    • ThreadB .. 以此类推
    • ThreadC {... some where setting of class A} and its not reflect in ThreadA and ThreadB..

    如果这是你的问题,那是因为 ThreadA 和 B 已经通过构造函数获得了 hash 引用并且正在处理它,在 ThreadC 中设置类 A 的 hash 不会影响 ThreadA 和 B 已经设置的 hash。

    考虑到您遵循了这些步骤

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

    考虑这个解决方案

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

    • A 类 {HashMap 哈希、getter 和 setter}
    • ThreadA {一个对象,

      ThreadA(A obj)

      {this.obj = obj}..

      // 使用 classAobj.getHash() 的 getter 访问 hash 并使用 hash map 进行处理

      }

    • ThreadB .. 以此类推

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2014-04-19
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      相关资源
      最近更新 更多