我是Java的新手,所以如果对以下简单案例的答案显而易见,那么请原谅。
class A{
public void foo(Customer cust){
cust.setName(cust.getFirstName() + " " + cust.getLastName());
cust.setAddress(new Address("Rome"));
}
}
我为类objectA
创建了一个Singleton对象(A
)。
鉴于我没有任何类变量,如果我从不同的线程调用objectA.foo(new Customer())
,它是否是线程安全的?
如果我将foo更改为static并从不同的线程调用A.foo(new Customer())
怎么办?
它仍然是线程安全的吗?
答案 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)
在函数访问静态共享变量时需要线程安全性。就像一个正在更新共享文档的函数一样,所以如果一个线程并行更新的两个线程将被忽略。或者是在应用程序,单例对象之间共享的静态变量。
以上是需要线程安全的情况在您的情况下,您没有更新任何共享资源,因此这是一个线程安全。