Java方法与成员同步

Java方法与成员同步,java,concurrency,synchronized,Java,Concurrency,Synchronized,我知道java的同步原语应用于方法时,在语义上相当于在方法执行期间锁定对象本身 但是,我不清楚这个原语的契约w.r.t.方法是如何同时访问对象的特定成员的。该原语是否仅保护在使用它的其他成员之间或在该对象的任何底层成员上同步的任何成员之间的并发访问 例如,如果同时调用下面示例中的foo()和bar(),这会导致内部事物上的数据争用吗 class Thing { InnerThing innerThing; OtherInnerThing otherInnerThing; pu

我知道java的同步原语应用于方法时,在语义上相当于在方法执行期间锁定对象本身

但是,我不清楚这个原语的契约w.r.t.方法是如何同时访问对象的特定成员的。该原语是否仅保护在使用它的其他成员之间或在该对象的任何底层成员上同步的任何成员之间的并发访问

例如,如果同时调用下面示例中的foo()和bar(),这会导致
内部事物上的数据争用吗

class Thing {
   InnerThing innerThing;
   OtherInnerThing otherInnerThing;

   public synchronized void foo() {
      innerThing.mutate();
    }
  
  public void bar() {
      synchronized(innerThing) {
            innerThing.mutate();
      }
   }
}
这个原语只是保护的合同吗 跨其他成员的并发访问 使用它,或跨在上同步的任何成员使用它 此对象的任何基础成员

前者。所有线程必须在同一对象上同步

如果线程1在实例上同步,而线程2尝试在该实例的某个成员对象上同步,则线程2不会被阻止


这是隐含的;该措辞涉及“同一监视器”。

“仅保护同时使用该监视器的其他成员之间的并发访问”——这一条。虽然Synchronized不是一个基本的…正确,但值得注意的是,没有“成员对象”这样的东西。只有两个不同的对象,而其中一个对象被另一个对象的成员变量引用这一事实与此无关。这可能是唯一的引用,使得对象在概念上包含在另一个引用中,但这是应用程序逻辑,而不是Java语言逻辑。JVM此时不检查是否有其他引用,因此该行为与在运行时共享的对象没有区别,因此在概念上不包含在另一个对象中。当然,您是对的。我的措辞松散。