我有一个方法如下:
public static void method() {
int i = 0;
i = i + 1;
}
我在静态方法中有一个int变量。并且该方法由几个线程访问 我的问题是:
i
变量是否符合竞争条件?答案 0 :(得分:6)
如果变量是在方法中声明的,那么它将存在于为方法的单个调用提供的堆栈帧中。只能通过调用该方法的线程访问堆栈帧。在发布的示例中没有竞争条件,方法的每次调用都获得自己的变量副本。你需要共享状态才能有竞争条件。
这些堆栈帧是在执行递归方法时堆积的东西,并占用堆栈空间,直到某个时候发生堆栈溢出错误,因为递归导致越来越多的堆栈帧被分配,而没有任何方法调用得到有机会完成(这将释放他们的堆栈空间)。
答案 1 :(得分:0)
否,静态方法的局部变量不存在竞争条件。因为对于方法的每次调用,无论是静态的还是非静态的,堆栈中都会有单独的内存,因此该静态方法的局部变量对于每个线程都是单独的,并且不存在竞争条件。