是静态方法线程安全内部的类实例

时间:2011-12-16 08:51:02

标签: java multithreading concurrency thread-safety

我有一个静态方法,如下

 public static void foo(){
     final ClassA a = new ClassA();
 } 

我在classA中有两个哈希映射。

这些哈希映射线程是否安全??

6 个答案:

答案 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()