【发布时间】:2021-05-27 22:40:21
【问题描述】:
我知道 java 的同步原语在应用于方法时,其语义相当于在方法执行期间锁定对象本身。
但是,我不清楚这个原语的合同 w.r.t.同时访问对象的特定成员的方法。该原语是否仅保护同时使用它的其他成员之间的并发访问,或者跨在该对象的任何基础成员上同步的任何成员之间的并发访问?
例如,如果下面示例中的 foo() 和 bar() 被同时调用,这会导致 innerThing 上的数据竞争吗?
class Thing {
InnerThing innerThing;
OtherInnerThing otherInnerThing;
public synchronized void foo() {
innerThing.mutate();
}
public void bar() {
synchronized(innerThing) {
innerThing.mutate();
}
}
}
【问题讨论】:
-
“只保护同时使用它的其他成员之间的并发访问”——这个。虽然同步不是原始的......
标签: java concurrency synchronized