![](/img/trans.png)
[英]What happens when few threads trying to call the same synchronized method?
[英]What happens when two threads call the same static method at the same time?
当两个线程同时调用相同的静态方法时会发生什么? 例如:
public static String someMethod(){
//some logic, can take about 1 second to process
return new String(result);
}
第一个线程现在调用someMethod()。 第二个线程从现在起0.5秒后调用someMethod()(第一个线程仍在处理数据)。
我知道someMethod()可以同步。 但如果不同步会发生什么?
调用方法时,JVM会在执行线程中为调用创建堆栈帧 。 此框架包含方法中声明的所有局部变量。 在任何不访问字段的方法(静态或其他方法)的情况下,每个执行在每个线程上完全独立地进行。 如果该方法在其计算中使用参数,则这些参数也位于堆栈帧中,并且多个调用不会相互干扰。
这取决于你的方法是否改变了外部状态。
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;
}
会引起问题:
++
不是原子操作。 它与{int n = i; i = i + 1; return n}
完全相同{int n = i; i = i + 1; return n}
{int n = i; i = i + 1; return n}
i = i + 1
也不是原子的,如果它在中间变化,则会重复一些值 但如果i
是一个局部变量,就没有问题。 只要任何外部状态在被读取时保证是不可变的,就永远不会有任何问题。
该方法是静态的这一事实无关紧要。 他们的问题应该是有问题的代码正在操纵哪些状态变量 。
如果两个语句在不同的线程中执行,则无法保证第一个线程更改对第二个线程是可见的,除非您通过使用给定的同步策略同步someMethod()
来建立这两个语句之间的先发条件关系。 换句话说,如果要写入相同的变量然后同时从两个线程读取,那么您的逻辑可能会产生意外和不可预测的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.