假设我在Java中有这样的类:
public class Function {
public static int foo(int n) {
return n+1;
}
}
如果我从一个线程调用这样的foo方法会发生什么?
x = Function.foo(y);
我能用两个线程做到这一点,没有它们互相等待吗?假设foo需要一段时间,并且它被调用很多,因此每个线程可能会尝试同时使用foo。他们可以这样做,还是我必须在Function实例方法中创建所有方法并为每个线程赋予它自己的Function对象?
答案 0 :(得分:14)
您正在调用的代码不存储任何状态,因此将确定性地返回是从一个线程还是多个线程调用 - 并且它不像“代码行”那样需要保护(因为您似乎暗示您的问题) ),因为它可以从多个线程运行“相同的代码行”,只要它们不共享数据(在这种情况下,不会)。
如果您有像
这样的代码,就会出现问题public class Function {
private static int last = 0;
public static int foo(int n) {
last += n;
return last;
}
}
这是当你开始需要担心破坏静态last
的不同线程时。
答案 1 :(得分:4)
只要foo()
只使用参数和局部变量,任何数量的线程都可以一次调用它(如果你有多个核心,它们甚至可以同时执行它。)
当该方法访问共享状态时,会出现从多个线程调用相同方法的问题。例如,如果Functions
也声明了静态地图:
private static Map<String,Object> myObjects;
在这种情况下,两个线程可能会尝试同时更新地图。由于大多数地图实现都没有内部同步,因此两个线程可能会更改相同的内部结构,并破坏地图数据。
在共享状态上进行同步虽然理论上很容易,但在实践中并不容易。例如,您可以简单地使用ConcurrentHashMap
,它可以由多个线程同时访问。但是,它不能保证调用之间的状态保存,所以你可以在时间X把东西放到地图中,而其他一些线程可以在第一个线程试图在时间Z再次访问它时在时间Y删除它。 / p>
答案 2 :(得分:4)
你应该知道每个线程都有自己的堆栈,并且n(这里唯一的变量)存在于堆栈中;所以那些线程不会干涉。