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
完全回答你的问题:
synchronized如果您正在使用需要并发访问的对象,则需要添加修饰符.
ben*_*n75 14
您对方法的所有调用都将同时执行...但是:
一旦静态方法的代码修改静态变量,就可能出现并发问题(并且处于非线程安全状态).在这种情况下,您可以将方法声明为synchronized
如果您的方法只使用局部变量,则不会出现并发问题.
Ted*_*opp 13
如果需要避免并发执行,则需要显式同步.该方法是静态的这一事实与它无关.如果您声明方法本身synchronized,则同步将在类对象上.否则,您将需要在某些静态对象上进行同步(因为this静态方法不存在).
我看到很多答案,但没有一个真正指出原因。
所以这可以这么想,
每当一个线程被创建时,它都是用自己的堆栈创建的(我猜创建时堆栈的大小是~2MB)。因此,发生的任何执行实际上都发生在该线程堆栈的上下文中。
创建的任何变量都存在于堆中,但它的引用存在于堆栈中,但不存在于线程堆栈中的静态变量除外。
您所做的任何函数调用实际上都被推送到线程堆栈上,无论是静态的还是非静态的。由于完整的方法被压入堆栈,任何发生的变量创建都存在于堆栈中(同样例外是静态变量)并且只能被一个线程访问。
所以所有的方法都是线程安全的,直到它们改变某个静态变量的状态。