Ern*_*dis 16 java static multithreading synchronized
当两个线程同时调用相同的静态方法时会发生什么?例如:
public static String someMethod(){
//some logic, can take about 1 second to process
return new String(result);
}
Run Code Online (Sandbox Code Playgroud)
第一个线程现在调用someMethod().第二个线程从现在起0.5秒后调用someMethod()(第一个线程仍在处理数据).
我知道someMethod()可以同步.但如果不同步会发生什么?
chr*_*ke- 23
调用方法时,JVM会在执行线程中为调用创建堆栈帧.此框架包含方法中声明的所有局部变量.在任何不访问字段的方法(静态或其他方法)的情况下,每个执行在每个线程上完全独立地进行.如果该方法在其计算中使用参数,则这些参数也位于堆栈帧中,并且多个调用不会相互干扰.
use*_*561 11
这取决于你的方法是否改变了外部状态.
static long i = 0l;
public static String someMethod(){
String accm = "";
for(;i < Integer.MAX_VALUE*20/*Just to make sure word tearing occurs*/; i++)
accm += i
return accm;
}
Run Code Online (Sandbox Code Playgroud)
会引起问题:
++不是原子操作.它完全一样{int n = i; i = i + 1; return n}
i = i + 1 也不是原子的,如果它在中间变化,一些值将重复但如果i是局部变量,就没有问题.只要任何外部状态在被读取时保证是不可变的,就永远不会有任何问题.
该方法是静态的这一事实无关紧要。他们的问题应该是相关代码正在操纵哪些状态变量。
| 归档时间: |
|
| 查看次数: |
12530 次 |
| 最近记录: |