线程和可变参数

时间:2014-01-08 15:21:26

标签: java multithreading thread-safety

我是Java的新手,所以如果对以下简单案例的答案显而易见,那么请原谅。

class A{
   public void foo(Customer cust){
       cust.setName(cust.getFirstName() + " " + cust.getLastName());
       cust.setAddress(new Address("Rome"));
   }
}

我为类objectA创建了一个Singleton对象(A)。

  1. 鉴于我没有任何类变量,如果我从不同的线程调用objectA.foo(new Customer()),它是否是线程安全的?

  2. 如果我将foo更改为static并从不同的线程调用A.foo(new Customer())怎么办? 它仍然是线程安全的吗?

3 个答案:

答案 0 :(得分:5)

  

鉴于我没有任何类变量,如果我调用它是否是线程安全的   来自不同线程的objectA.foo(new Customer())?

当然是。您的foo()方法不会更改A对象的任何状态(因为它没有任何状态),并且您传递的对象new Customer()作为方法的参数不是可用于任何其他线程。

  

如果我将foo更改为static并从中调用A.foo(new Customer())该怎么办?   不同的线程?它仍然是线程安全的吗?

只要你没有任何可变的static状态,你仍然很好。

答案 1 :(得分:3)

,它将是线程安全的 IF 您从不同的线程调用foo(new Customer())。但这只是因为每次调用new Customer()时你都会创建一个新的(因而不同的)Customer对象,而foo所做的就是改变传递给它的Customer的状态。因此,这些线程不会发生冲突,因为即使他们调用相同的方法,他们也会操纵不同的客户。

然而,如果您要先创建客户变量

Customer bob = new Customer()

然后从两个不同的线程调用foo(bob),它不是线程安全的。第一个线程可能是在第二个线程更改名称时更改地址,导致行为不一致和/或数据损坏。

如果你想让这个方法真正线程安全,只需声明方法同步:

public synchronized void foo(Customer cust) {...}

答案 2 :(得分:1)

在函数访问静态共享变量时需要线程安全性。就像一个正在更新共享文档的函数一样,所以如果一个线程并行更新的两个线程将被忽略。或者是在应用程序,单例对象之间共享的静态变量。

以上是需要线程安全的情况在您的情况下,您没有更新任何共享资源,因此这是一个线程安全。