【问题标题】:Synchronized statement, unclear java doc example同步语句,不清楚java doc例子
【发布时间】:2026-02-19 21:05:02
【问题描述】:

目前我正在尝试理解synchronized在Java中得到synchronized statements下的this java doc示例MsLunch类的示例和两个实例变量c1 and c2

它说:

例如,假设类MsLunch有两个实例字段c1c2, 从不一起使用。这些字段的所有更新必须同步, 但是没有理由阻止c1 的更新与c2 的更新交错- 这样做会通过创建不必要的阻塞来降低并发性。

在我看来,这听起来像 c1 and c2 不允许一起使用。这就是为什么增加c1 and c2 的两个语句必须同步的原因。 但是为什么他们在下一句中说没有理由阻止c1 的更新与c2 的更新交错。这句话对我来说完全没有意义。首先他们说它们没有一起使用,现在可以增加c1,同时增加c2

谁能给我详细说明一下这一段。

请记住,我的母语不是英语,实际上在理解这个问题时可能存在语言问题。

【问题讨论】:

  • 您将“从不一起使用”误解为“不允许一起使用”。单独同步它们的建议并不是为了强制执行这样的规则,而是为了利用这种情况。

标签: java synchronized


【解决方案1】:

c1 和 c2 是两个完全独立的计数器。一个线程应该能够增加 c1 而另一个线程增加 c2。如果您只是同步 inc1() 和 inc2() 方法,您将阻止线程 1 增加 c1 而线程 2 增加 c2(反之亦然)。这将对性能产生负面影响。所以你使用两个单独的锁来同步每个增量。

例如,如果 c2 的值取决于 c1 的值,那么您将不得不使用单个锁来避免竞争条件。

【讨论】:

  • 这让我很清楚。这也是他不通过这个换锁的原因。相反,他正在创建两个具有自己内在锁的对象,例如线程 1 可以增加 c1,而线程 2 可以增加 c2!对吗?
  • 是的。同步方法本身相当于使用 synchronized(this)。
【解决方案2】:

这些字段的所有更新必须同步,但没有 阻止c1 的更新与 c2 的更新——这样做会通过创建 不必要的阻塞。而不是使用同步方法或 否则使用与此关联的锁,我们创建两个对象 只是为了提供锁。

引用自javadoc

他们声明没有理由阻止c1 的更新与c2 的更新交错,因为它们之间没有任何关系(它们似乎是独立的)。因此,它们为两者提供了不同的锁定对象,这意味着您可以同时更新两个c1 and c2

我不确定这是否足以让您理解,如果是,请在下方发表评论,以便我们进一步讨论。

【讨论】: