Java 线程之间的共享哈希映射

Java 线程之间的共享哈希映射,java,multithreading,thread-safety,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 Hash

我有一节课

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使用setter方法来更改hashmap。新值不会反映在线程A和B中。 有什么问题吗?
谢谢

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


我很确定这会解决它的…

时间晚了,现在是星期天…但是你不需要使用静态类吗


我很确定这会解决它…

两个
ThreadA
anf
ThreadB
在它们的构造函数中接收一个
HashMap
,而不是类
a
的对象

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


如果要确保两个线程都可以访问新的
HashMap
,则必须为它们提供新的引用(因此还需要在
ThreadA
中创建一个setter方法,并将对
ThreadA
对象的引用存储在某处,以便以后可以调用setter),或者直接传递类
A
的对象,这两个
ThreadA
anf
ThreadB
在其构造函数中接收
HashMap
,而不是类
A
的对象

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


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

我这样理解你的问题。
您有以下几件事..

  • 类A{静态哈希映射哈希,getter和setter}
  • ThreadA{HashMap hash,ThreadA(HashMap hash){this.hash=hash}
  • ThreadB。。诸如此类
  • ThreadC{…某些地方设置类A}的哈希值,并且它没有反映在ThreadA和ThreadB中。。
如果这是您的问题,那是因为ThreadA和B已经通过构造函数获得了散列引用并正在处理它,在ThreadC中设置类A的散列不会影响ThreadA和B已经设置的散列

假设您遵循了这些步骤

  • 创建了一个散列-假设它引用的是地址1001
  • 传递给threadA和threadB,以便它们具有参考1001的散列
  • 在threadC中创建了另一个哈希-假设它引用的是2001
  • 将ThreadC创建的散列设置为A类。也就是说,现在A类散列有参考2001,ThreadA和ThreadB仍保留参考1001的散列,仅此而已
  • 考虑一下这个解决方案

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

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

      螺纹A(A obj)

      {this.obj=obj}

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

      }

    • ThreadB。。诸如此类

      • 我是这样理解你的问题的。
        您有以下几件事..

        • 类A{静态哈希映射哈希,getter和setter}
        • ThreadA{HashMap hash,ThreadA(HashMap hash){this.hash=hash}
        • ThreadB。。诸如此类
        • ThreadC{…某些地方设置类A}的哈希值,并且它没有反映在ThreadA和ThreadB中。。
        如果这是您的问题,那是因为ThreadA和B已经通过构造函数获得了散列引用并正在处理它,在ThreadC中设置类A的散列不会影响ThreadA和B已经设置的散列

        假设您遵循了这些步骤

      • 创建了一个散列-假设它引用的是地址1001
      • 传递给threadA和threadB,以便它们具有参考1001的散列
      • 在threadC中创建了另一个哈希-假设它引用的是2001
      • 将ThreadC创建的散列设置为A类。也就是说,现在A类散列有参考2001,ThreadA和ThreadB仍保留参考1001的散列,仅此而已
      • 考虑一下这个解决方案

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

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

          螺纹A(A obj)

          {this.obj=obj}

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

          }

        • ThreadB。。诸如此类

        我只在a类中看到一个setter;在
        ThreadA
        ThreadB
        中,您到底是如何更改HashMap实例的?请查看ConcurrentHashMaps以了解线程安全性。我在a班只看到一个二传手;在
        ThreadA
        ThreadB
        中,您到底是如何更改HashMap实例的?请查看ConcurrentHashMaps以了解线程安全性。更新时可能也会有一些互斥锁。。。。更新时可能也会有一些互斥锁。。。。