Java同步函数生成的代码

时间:2015-01-14 15:01:10

标签: java synchronization

我真的没有看到

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

和此:

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

我的意思是,在引擎盖下,JVM必须使用lock()和unlock()我猜? 所以无论发生什么(行为或Tbl),我都会以同样的方式锁定吗?

更新 好的,我现在理解你的帮助和Java doc:

" ...每个对象都有与之关联的内在锁定..."

"同步语句......"

3 个答案:

答案 0 :(得分:1)

是的,有区别,因为您永远不知道哪些其他帖子在sychronizedTable上使用了Account

问问自己这个问题 - 您是否试图在Table方法中阻止Accountsychronizedfoo_fct块执行期间的其他可变操作?

答案 1 :(得分:0)

synchronized(var)块将根据您省略的 ... 块产生差异,即您需要同步并发线程访问的变量。

答案 2 :(得分:0)

如果表和帐户以固定的独占对组织,则表示不会通过不同的并发线程使用不同的帐户实例调用表x上的foo_fct(反之亦然),并且代码中没有其他部分可以进行其他同步操作同时在你的程序中的表或帐户,然后两种锁定方式是等效的。

否则两种方法都会有所不同。