Java 同步函数生成的代码

Code generated by Java synchronized function

我真的看不出

之间的执行差异
public void foo_fct( Table Tbl, Account act)
{
  synchronized(Tbl) {
    ...
  }
}

还有这个:

public void foo_fct( Table Tbl, Account act)
{
  synchronized(act) {
    ...
  }
}

我的意思是,在幕后,JVM 必须使用 lock() 和 unlock() 我猜? 所以无论发生什么(act 或 Tbl)我都会以同样的方式锁定 no ?

更新 好的,在您的帮助和 Java 文档 :

的帮助下,我现在明白了

"...每个对象都有一个与之关联的内部锁..."

"synchronized statements..."

是的,这是有区别的,因为您永远不知道 TableAccount 上还有哪些其他线程正在使用 sychronized

问问自己这个问题——您是否试图在 [=16= 中的 sychronized 块执行期间阻止 TableAccount 上的其他可变操作] 方法?

synchronized(var) 块将根据您省略的 ... 块有所不同,即您已经需要在哪个变量上同步并发线程访问。

如果 table 和帐户以固定的独占对组织,这意味着 table x 上的 foo_fct 将由不同的并发线程使用不同的帐户实例调用(反之亦然)并且没有代码的其他部分同时对 tables 或程序中的帐户进行其他同步操作,那么两种锁定方式是等效的。

否则两种方法都会不同。