静态方法中变量的竞争条件

时间:2017-02-23 04:28:12

标签: java multithreading static static-methods race-condition

我有一个方法如下:

public static void method() {

int i = 0;
i = i + 1;

}

我在静态方法中有一个int变量。并且该方法由几个线程访问 我的问题是:

  1. i变量是否符合竞争条件?
  2. 如果方法在spring web应用程序中访问并且多个用户同时访问该怎么办?

2 个答案:

答案 0 :(得分:6)

如果变量是在方法中声明的,那么它将存在于为方法的单个调用提供的堆栈帧中。只能通过调用该方法的线程访问堆栈帧。在发布的示例中没有竞争条件,方法的每次调用都获得自己的变量副本。你需要共享状态才能有竞争条件。

这些堆栈帧是在执行递归方法时堆积的东西,并占用堆栈空间,直到某个时候发生堆栈溢出错误,因为递归导致越来越多的堆栈帧被分配,而没有任何方法调用得到有机会完成(这将释放他们的堆栈空间)。

答案 1 :(得分:0)

否,静态方法的局部变量不存在竞争条件。因为对于方法的每次调用,无论是静态的还是非静态的,堆栈中都会有单独的内存,因此该静态方法的局部变量对于每个线程都是单独的,并且不存在竞争条件。