如果对象的公共方法仅使用传递的参数和局部变量,则
我们可以说它是线程安全的吗?
答案 0 :(得分:9)
所谓的pure function确实是线程安全的,但只有在绝对没有副作用的情况下(即通过参数改变传入的对象)。
答案 1 :(得分:3)
如果未修改 local memeber变量且未更改传递参数的状态(即通过这些参数上的方法),则它是线程安全的。
此外,如果传递的参数是对象,那么将它们作为最终参数并不能保证线程安全。
public class Foo{
private int count = 1;
public void incrementFoo(){
count += 1;
}
public int getFoo(){
return count;
}
}
private int multiplier = 5;
//Not safe
public static int calculateFoo(final Foo myFoo){
//you can still do this, even if myFoo is final
myFoo.incrementFoo();
return myFoo.getFoo() * multiplier;
}
答案 2 :(得分:1)
是的,这是线程安全的。它不能干扰其他方法的调用。 (除非它有一些其他令人讨厌的副作用。)
任何交错的方法指令和任何其他方法的指令都可以。
答案 3 :(得分:1)
这取决于。有很多方法可以很容易地保证线程安全。
首先,如果传递给方法的任何参数不是线程安全的,并且您的方法在没有正确同步的情况下以多线程方式使用它,则它不是线程安全的。例如,
// HashMap is not thread safe
public void foo(String key, HashMap<String,String> map) {
String value = map.get(key);
if (value == null) {
map.put(key, "new value");
}
}
另一种可能性是,如果在方法中创建的任何对象都会转义该方法。请考虑以下事项:
public void foo() {
Map map = ...; // create and populate the map
ListenerQueue.getQueue().add(map); // there are listener threads waiting on this queue
// do some other work
}
如果有其他线程正在等待此队列并开始使用地图对象,则地图对象已转义,并受到相同的线程安全问题。