如果方法不使用对象的字段,那么它是线程安全的吗?

时间:2010-05-11 08:43:43

标签: java multithreading thread-safety

如果对象的公共方法仅使用传递的参数和局部变量,则

我们可以说它是线程安全的吗?

4 个答案:

答案 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
}

如果有其他线程正在等待此队列并开始使用地图对象,则地图对象已转义,并受到相同的线程安全问题。