Java 何时为同步方法分配参数?

Java 何时为同步方法分配参数?,java,multithreading,synchronized,Java,Multithreading,Synchronized,调用synchronized方法时,我记不起何时分配了参数 public int methodA() { return ... } public synchronized void methodB(int arg) {} 从多个线程调用methodB时 methodB(methodA()); 我知道在前一个线程运行完methodB之前,线程一直处于阻塞状态。 我的问题是何时分配arg?(或者说什么时候调用methodA()。 是在阻塞发生之前还是之后?MethodA首先执行。在执行线程尝试

调用
synchronized
方法时,我记不起何时分配了参数

public int methodA() { return ... }

public synchronized void methodB(int arg) {}
从多个线程调用methodB时

methodB(methodA());
我知道在前一个线程运行完methodB之前,线程一直处于阻塞状态。 我的问题是何时分配arg?(或者说什么时候调用methodA()。
是在阻塞发生之前还是之后?

MethodA首先执行。在执行线程尝试进入methodB之前,不会获取调用methodB的对象上的内部锁

这在JLS中,请参阅

同步方法(§8.4.3.6)在被调用时自动执行锁定操作;在锁定操作成功完成之前,不会执行其主体。如果该方法是实例方法,它将锁定与调用它的实例(即,在方法体执行期间称为this的对象)关联的监视器。如果该方法是静态的,它将锁定与表示在其中定义该方法的类的类对象关联的监视器。如果方法主体的执行曾经正常或突然完成,则会在同一监视器上自动执行解锁操作


JLS表示在调用该方法时获取锁。methodA完成并提供返回值之前,MethodB不会被调用。

@JiaLi请确保您的代码在发布之前编译。@BeUndead它是指定的。这相当于将方法体包装在
synchronized(this){…}
块中。
methodA()
在阻塞之前被调用。否则,
methodA()
的行为就好像它也是同步的一样。您应该这样想,就好像您调用了
methodA()
并将其返回值赋给了一个局部变量,然后将其传递给
methodB
@JohnKugelman:对于方法结果未在方法中使用的情况,我留了一些宽大的余地,并且对系统没有影响-我不知道该语言是否指定必须执行对
methodA()
的调用。例如,如果它只是
返回null
s,我不知道它是否内联。@BeUndead:如果优化是相关的,那么VM将锁粗化作为一个优化选项,这可能会使事情复杂化。但没有看到优化methodA是如何改变事情的。