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

时间:2013-08-31 11:28:33

标签: 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);
}

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

有两种情况:

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

6 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:2)

是的,但仅限于两种情况

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

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

答案 2 :(得分:2)

创建线程时,它将创建自己的堆栈(方法和局部变量)。

两个线程将有两个堆栈,一个线程永远不会与任何其他线程共享其堆栈。

只有在同一个对象上调用它才会生效。

答案 3 :(得分:1)

如果在多个线程中调用相同的方法,并将其传递给同一个对象,则该对象绝对安全。

答案 4 :(得分:0)

局部变量存储在每个线程自己的堆栈中。这意味着线程之间永远不会共享局部变量。这也意味着所有本地原始变量都是线程安全的。

修改

此示例中的LocalObject实例不从方法返回,也不会传递给可从sharedMethod()方法外部访问的任何其他对象。

执行sharedMethod()方法的每个线程都将使用自己的对象o作为参数。

因此,整个方法sharedMethod()似乎是线程安全的。

唯一的例外是,如果使用Object o作为参数调用的方法之一,以允许从其他线程访问它的方式存储Object o实例。

答案 5 :(得分:0)

这样对待它。

如果您的线程不共享任何公共资源,那么就不可能出现并发问题。 我们可以从您提供的信息中了解到,这里唯一可以分享的是someObject。如果它本身是线程安全的,或者是为每个线程复制的,那么除非你的代码通常是线程安全的,否则除非有其他共享资源。