方法参数在Java中是否安全?

Nar*_*hai 14 java multithreading thread-safety method-parameters

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

//this is how threads call the shared method
run(){
     sharedInstance.sharedMethod(someObject);
}
Run Code Online (Sandbox Code Playgroud)

现在将o作为参数传递给方法.多个线程并行调用相同的方法.我们可以安全地说这段代码是线程安全的吗?

有两种情况:

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

MD *_*med 13

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