并发访问静态方法

use*_*058 19 java methods concurrency static simultaneous

我有一个带有以下签名的静态方法:

public static List<ResultObjects> processRequest(RequestObject req){
  // process the request object and return the results.
}
Run Code Online (Sandbox Code Playgroud)

当同时对上述方法进行多次调用时会发生什么?请求是同时处理还是一个接一个地处理?

And*_*niy 25

完全回答你的问题:

  1. 方法将同时执行(如果你有多个线程,则同时多次执行).
  2. 请求将同时处理.

synchronized如果您正在使用需要并发访问的对象,则需要添加修饰符.

  • @vijayakumar方法只是一组指令.当您从2个不同的线程调用静态方法时,这两个线程都被赋予相同的指令.这就是他们同时工作的原因,而不必"排队等候".Thread-1不一定知道或关心Thread-2是否遵循相同的指令(除非它们访问共享数据,这是可能发生并发问题的地方). (4认同)
  • 每当你想要防止并发执行时,你需要添加`synchronized`.字段或方法是否是"静态"与此考虑无关. (2认同)

ben*_*n75 14

您对方法的所有调用都将同时执行...但是:

一旦静态方法的代码修改静态变量,就可能出现并发问题(并且处于非线程安全状态).在这种情况下,您可以将方法声明为synchronized

如果您的方法只使用局部变量,则不会出现并发问题.

  • 我认为这条线是让更多人绊倒“如果你的方法只使用局部变量,你就不会有并发问题。”的原因。我认为这应该得到更多的赞成! (2认同)

Ted*_*opp 13

如果需要避免并发执行,则需要显式同步.该方法是静态的这一事实与它无关.如果您声明方法本身synchronized,则同步将在类对象上.否则,您将需要在某些静态对象上进行同步(因为this静态方法不存在).


swa*_*ina 7

我看到很多答案,但没有一个真正指出原因。

所以这可以这么想,
每当一个线程被创建时,它都是用自己的堆栈创建的(我猜创建时堆栈的大小是~2MB)。因此,发生的任何执行实际上都发生在该线程堆栈的上下文中。
创建的任何变量都存在于堆中,但它的引用存在于堆栈中,但不存在于线程堆栈中的静态变量除外。

您所做的任何函数调用实际上都被推送到线程堆栈上,无论是静态的还是非静态的。由于完整的方法被压入堆栈,任何发生的变量创建都存在于堆栈中(同样例外是静态变量)并且只能被一个线程访问。

所以所有的方法都是线程安全的,直到它们改变某个静态变量的状态。