【发布时间】:2021-01-18 15:06:28
【问题描述】:
我不记得在调用 synchronized 方法时分配参数的时间。
public int methodA() { return ... }
public synchronized void methodB(int arg) {}
当从多个线程调用methodB时
methodB(methodA());
我知道线程被阻塞,直到前一个线程完成运行方法 B。 我的问题是什么时候分配 arg ? (或者说何时调用 methodA() ?)。 是在阻塞发生之前还是之后?
【问题讨论】:
-
@JiaLi 请确保您的代码在发布前编译。
-
@BeUndead 已指定。相当于将方法体包装在
synchronized (this) { ... }块中。 -
methodA()在阻塞前被调用。否则,methodA()的行为也会像synchronized一样。您应该想到的方式就像您调用methodA()并将其返回值分配给一个局部变量,然后您将其传递给methodB。 -
@JohnKugelman:对于方法结果未在方法中使用并且对系统没有影响的情况,我留下了一些宽大处理 - 我不知道语言是否指定调用
methodA()必须执行。例如,如果它只是return nulls,我不知道它是否被内联。 -
@BeUndead:好吧,如果优化是相关的,那么 VM 将锁定粗化作为优化选项,这可能会使事情复杂化。虽然没有看到优化方法A如何改变事情。
标签: java multithreading synchronized