lyn*_*nks 6 java synchronization
我有一个似乎 "使用"同步的同步方法比它应该显着更长.它看起来像;
public static synchronized void myMethod(MyParameter p) {
//body (not expensive)
}
Run Code Online (Sandbox Code Playgroud)
电话看起来像;
myMethod(generateParameter());
Run Code Online (Sandbox Code Playgroud)
凡generateParameter()被称为是一个非常昂贵(需要很长的时间)调用.我的想法是,myMethod在执行过程中类上的互斥锁被阻塞了,generateParameter()这是怎么回事?我发现它是一个不同的调试问题,但这似乎正在发生.
那不可能; 该generateParameter()呼叫被首先执行,然后其结果被作为参数传递给该给定myMethod呼叫,这然后抓起该互斥.
它需要很长时间,还是无限期阻止?(僵局)
不,不会发生什么.
方法generateParameter在调用之前执行myMethod.
在Java中,始终在方法调用之前评估所有方法参数.
方法调用的规范详细解释了它(感谢Victor Sorokin).
在运行时,方法调用需要五个步骤.首先,可以计算目标参考.其次,评估参数表达式.第三,检查要调用的方法的可访问性.第四,找到要执行的方法的实际代码.第五,创建新的激活帧,如果需要则执行同步,并且将控制转移到方法代码.
除了新变量之外,您的代码与下面的代码相同:
MyParameter p = generateParameter();
myMethod(p);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
328 次 |
| 最近记录: |