我有一个静态方法,如下
public static void foo(){
final ClassA a = new ClassA();
}
我在classA中有两个哈希映射。
这些哈希映射线程是否安全??
答案 0 :(得分:3)
如果HashMaps
中的classA
是非静态的(为每个新的ClassA()
创建新的),那么你可以从多个线程调用foo并保证只有一个线程可以运行为该线程创建的HashMaps
实例中的classA
。
答案 1 :(得分:1)
我不同意(我错过了什么)?
在方法内创建了一个新的ClassA实例。即使多个线程访问该方法,每个线程都将使用一个独特的HashMap。
如果ClassA是一个实例变量,它会有所不同。此外,如果ClassA同时访问地图,则会出现线程问题。
此外,如果地图是静态的,则ClassA的多个实例可以访问它,是的,那将是一种概率。
答案 2 :(得分:1)
目前尚不清楚是否要使用多个线程访问对象a
内的哈希映射,或者使用多个线程调用方法foo
。
在第一种情况下,集合的线程安全性与外部上下文无关,即它是在静态上下文中创建的。所以不,如果您尝试从具有多个线程的对象a
访问哈希映射,则会导致意外行为。您需要使用synchronized
块来管理对它们的访问。
在第二种情况下,每个线程在其堆栈上将具有不同的foo副本,并分配ClassA
的不同实例。因此,它们不会发生冲突,因为它们会有不同的HashMaps
来处理。
请说明您正在处理哪些案例。
答案 3 :(得分:0)
类HashMap
不是线程安全的。
请注意,此实现未同步。如果多个线程同时访问此映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步
但是,当您调用代码foo
时,每次都会收到一个新的ClassA
,因此调用foo
的两个不同线程可以访问ClassA
的不同实例。假设ClassA
内的哈希映射不是静态的或共享的,代码应该可以正常工作。
答案 4 :(得分:0)
编写代码的方式将使您的静态方法可用于所有线程,因此每个线程将获得自己的类对象。所以每个类都有自己的哈希映射。
但是如果你想为所有线程使用相同的哈希映射,那么尝试将其设为synchronized
。
答案 5 :(得分:0)
HashMap
不是线程安全的,但假设您从未在a
之外发布实例foo()
及其两个哈希映射,那么这三个都只限于一个线程而不必是线程-safe。
如果您发布a
或其哈希映射,或者哈希映射是ClassA
的静态成员,则应确保线程安全。假设没有涉及散列映射或其他状态变量的不变量,您只需使用ConcurrentHashMap
即可完成此操作。如果存在这样的不变量,您应该同步,理想情况下尽可能接近状态变量,即ClassA
而不是foo()
。