方法参数在Java中线程安全吗?

Class Shared{    
     public void sharedMethod(Object o){
          //does something to Object
     }     
}

//this is how threads call the shared method
run(){
     sharedInstance.sharedMethod(someObject);
}

现在,正在将 作为参数传递给该方法。同一个方法被多个线程并行调用。我们可以肯定地说这个代码是线程安全的吗?o

有两种情况:

  • 如果在线程之间共享someObject
  • 如果每个线程都有自己的副本someObject

答案 1

不,你不能这么说。方法参数是线程的本地参数,这意味着每个线程都有自己的引用变量副本,但是如果您使用来自多个线程的相同对象调用此方法,则参数将在它们之间共享(请记住,Java是按值传递的)。在这种情况下,您需要提供显式同步以避免麻烦。o


答案 2

是的,但仅在两种情况下

  • 如果在参数中传递的每个对象都是不可变的o
  • 如果您的代码保证最多有一个线程在处理 所引用的对象。o

否则 - ,因为对象的内部状态可以由多个线程同时更改。