java - Java 方法与成员同步
问题描述
我知道java的同步原语,当应用于方法时,在语义上等同于在方法执行期间锁定对象本身。
但是,我不清楚这个原语的合约 wrt 方法同时访问对象的特定成员。该原语是否仅保护也使用它的其他成员之间的并发访问,或者在该对象的任何基础成员上同步的任何成员之间的并发访问?
例如,如果下面示例中的 foo() 和 bar() 被同时调用,这会导致数据竞争innerThing
吗?
class Thing {
InnerThing innerThing;
OtherInnerThing otherInnerThing;
public synchronized void foo() {
innerThing.mutate();
}
public void bar() {
synchronized(innerThing) {
innerThing.mutate();
}
}
}
解决方案
此原语是否仅保护也使用它的其他成员之间的并发访问,或者跨在该对象的任何底层成员上同步的任何成员之间的并发访问。
前者。所有线程必须在同一个对象上同步。
如果线程 1 在实例上同步,并且线程 2 尝试在该实例的某个成员对象上同步,线程 2 将不会被阻塞。
这在Java 语言规范中是隐含的;措辞谈到“同一台显示器”。
推荐阅读
- mysql - 如何创建 BEFORE INSERT 触发器
- apache-spark - Spark HashPartitioner 碰撞机制?
- scala - 循环遍历数据框列以形成嵌套数据框 - Spark
- postgresql - 哪个 Postgres 多 client_encoding 最佳实践?
- oauth-2.0 - 如何使用刷新令牌获取访问令牌?
- c# - 如何在不使用客户端 JSON.Parse 的情况下使用 JsonConvert.SerializeObject 和 JsonResult 进行 HTTP 响应
- sql - Oracle中所有标识列的列表
- python - 使用带有条件的 iat 查找值
- sql - 我怎样才能把一根绳子分成不同的部分,然后把每一块分成一层?
- javascript - JS - 如何在不重新加载网页的情况下删除活动的 eventListener