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
anfThreadB
在它们的构造函数中接收一个HashMap
,而不是类a
的对象
即使以后更改类A
的对象的hash
属性,这也不会更改两个线程已经接收和存储的HashMap
引用
如果要确保两个线程都可以访问新的
HashMap
,则必须为它们提供新的引用(因此还需要在ThreadA
中创建一个setter方法,并将对ThreadA
对象的引用存储在某处,以便以后可以调用setter),或者直接传递类A
的对象,这两个ThreadA
anfThreadB
在其构造函数中接收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中。。
- 类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中。。
- 创建了一个散列-假设它引用的是地址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。。诸如此类
- 我是这样理解你的问题的。
您有以下几件事..
ThreadA
和ThreadB
中,您到底是如何更改HashMap实例的?请查看ConcurrentHashMaps以了解线程安全性。我在a班只看到一个二传手;在ThreadA
和ThreadB
中,您到底是如何更改HashMap实例的?请查看ConcurrentHashMaps以了解线程安全性。更新时可能也会有一些互斥锁。。。。更新时可能也会有一些互斥锁。。。。