带有昂贵参数的Java同步方法

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()这是怎么回事?我发现它是一个不同的调试问题,但这似乎正在发生.

Miq*_*uel 5

那不可能; 该generateParameter()呼叫被首先执行,然后其结果被作为参数传递给该给定myMethod呼叫,这然后抓起该互斥.

它需要很长时间,还是无限期阻止?(僵局)


Grz*_*Żur 5

不,不会发生什么.

方法generateParameter在调用之前执行myMethod.

在Java中,始终在方法调用之前评估所有方法参数.

方法调用规范详细解释了它(感谢Victor Sorokin).

在运行时,方法调用需要五个步骤.首先,可以计算目标参考.其次,评估参数表达式.第三,检查要调用的方法的可访问性.第四,找到要执行的方法的实际代码.第五,创建新的激活帧,如果需要则执行同步,并且将控制转移到方法代码.

除了新变量之外,您的代码与下面的代码相同:

MyParameter p = generateParameter();
myMethod(p);
Run Code Online (Sandbox Code Playgroud)