2013-07-26 63 views
1

我有静态方法,它本身调用另一个静态方法。静态方法以对象引用作为参数调用另一个静态方法:线程安全吗?

例如:

public List<Object> static first(int id){ 

     List<Object> list=new ArrayList<Object>(); 
     list.add(a); 
     list.add(b); 
     list.add(c); 

     //calling another static method 
     second(id,list); 

     return list; 

} 

public String static second(int id,List<Object> listRef){ 

     listRef.add(a); 
     listRef.add(b); 
     listRef.add(c); 


} 

我的问题是:

多线程调用public static method first(int id);用不同的ID。

这是线程安全的方式吗?正如我在方法中声明arrayList而我的东西它的引用可能由其他线程共享。

问题是,阵列由多个线程 可能发生存储在没有个人 线程Stack.So我想分享的数组引用堆内存。

回答

2

每个thread都有自己的method的副本。静态方法只是属于Class而不是对象的方法。只要你不操纵任何shared variablesresources,它是线程安全的。

+0

是的你是对的,但在该方法中声明的对象存储在堆中,而不是堆栈,因为它的(堆栈)大小是固定的 –

+0

局部变量不直接与堆和堆栈相关。一个本地int将被存储在堆栈上,而一个本地对象将被存储在堆上,并且它的引用被堆栈。 – rocketboy

+0

好吧,我明白谢谢! :) –

10

是的,它是线程安全的。你的ArrayList是一个局部变量,不被线程共享(除非你明确地做了一些分享)。

在这种情况下,每个线程都将拥有自己的ArrayList。

+0

由于arraylist存储在堆内存中,而不是每个线程的个人堆栈,所以我恐怕共享可能发生? –

+0

一个问号会做。 –

+1

@HarshadDeshmukh我不明白你的目标。 “ArrayList”存储在堆而不是堆栈中有什么关系?它们仍然引用不同的'ArrayLists',因为它们来自方法的不同调用。所以,将不会共享... –

1

只要您不直接从每个线程调用second,它就是线程安全的。为此,您应该考虑制作second私人方法。

1

什么样的物体是a,b & c?由于这是刚刚加入的东西到一个列表中,然后调用另一个静态方法,我看不出有任何问题

所以,是它的线程安全的..