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..."
是的,这是有区别的,因为您永远不知道 Table
或 Account
上还有哪些其他线程正在使用 sychronized
。
问问自己这个问题——您是否试图在 [=16= 中的 sychronized
块执行期间阻止 Table
或 Account
上的其他可变操作] 方法?
synchronized(var)
块将根据您省略的 ... 块有所不同,即您已经需要在哪个变量上同步并发线程访问。
如果 table 和帐户以固定的独占对组织,这意味着 table x 上的 foo_fct 将由不同的并发线程使用不同的帐户实例调用(反之亦然)并且没有代码的其他部分同时对 tables 或程序中的帐户进行其他同步操作,那么两种锁定方式是等效的。
否则两种方法都会不同。
我真的看不出
之间的执行差异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..."
是的,这是有区别的,因为您永远不知道 Table
或 Account
上还有哪些其他线程正在使用 sychronized
。
问问自己这个问题——您是否试图在 [=16= 中的 sychronized
块执行期间阻止 Table
或 Account
上的其他可变操作] 方法?
synchronized(var)
块将根据您省略的 ... 块有所不同,即您已经需要在哪个变量上同步并发线程访问。
如果 table 和帐户以固定的独占对组织,这意味着 table x 上的 foo_fct 将由不同的并发线程使用不同的帐户实例调用(反之亦然)并且没有代码的其他部分同时对 tables 或程序中的帐户进行其他同步操作,那么两种锁定方式是等效的。
否则两种方法都会不同。