静态方法中变量的竞争条件
Race condition in variable in a static method
我有一个方法如下:
public static void method() {
int i = 0;
i = i + 1;
}
我在静态方法中有一个 int 变量。并且该方法被多个线程访问。
我的问题是:
i
变量是否进入竞争状态?
- 如果在spring web 应用中访问的方法被多个用户同时访问怎么办?
如果变量是在方法中声明的,那么它就存在于为方法的单次调用提供的栈帧中。堆栈帧仅由调用该方法的线程访问。发布的示例中没有竞争条件,方法的每次调用都会获得自己的变量副本。您需要共享状态才能拥有竞争条件。
这些stackframes是执行递归方法时堆积起来的东西,占用stack space直到某个时候系统用完space,出现Whosebug错误,因为递归导致越来越多的堆栈帧被分配,而 none 的方法调用有机会完成(这将释放它们的堆栈 space)。
不,静态方法的局部变量没有竞争条件。因为对于静态或非静态方法的每次调用都会在堆栈中有单独的内存,因此该静态方法的局部变量对于每个线程都是单独的,并且不会存在竞争条件。
我有一个方法如下:
public static void method() {
int i = 0;
i = i + 1;
}
我在静态方法中有一个 int 变量。并且该方法被多个线程访问。
我的问题是:
i
变量是否进入竞争状态?- 如果在spring web 应用中访问的方法被多个用户同时访问怎么办?
如果变量是在方法中声明的,那么它就存在于为方法的单次调用提供的栈帧中。堆栈帧仅由调用该方法的线程访问。发布的示例中没有竞争条件,方法的每次调用都会获得自己的变量副本。您需要共享状态才能拥有竞争条件。
这些stackframes是执行递归方法时堆积起来的东西,占用stack space直到某个时候系统用完space,出现Whosebug错误,因为递归导致越来越多的堆栈帧被分配,而 none 的方法调用有机会完成(这将释放它们的堆栈 space)。
不,静态方法的局部变量没有竞争条件。因为对于静态或非静态方法的每次调用都会在堆栈中有单独的内存,因此该静态方法的局部变量对于每个线程都是单独的,并且不会存在竞争条件。