同步语句,不清楚 java 文档示例

Synchronized statement, unclear java doc example

目前我正在尝试理解 Java 中的 synchronized 获取 this java doc example under synchronized statements class MsLunch 和两个实例变量 c1 and c2.

它指出:

Suppose, for example, class MsLunch has two instance fields, c1 and c2, that are never used together. All updates of these fields must be synchronized, but there's no reason to prevent an update of c1 from being interleaved with an update of c2 — and doing so reduces concurrency by creating unnecessary blocking.

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

谁能详细解释一下这一段。

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

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

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

All updates of these fields must be synchronized, but there's no reason to prevent an update of c1 from being interleaved with an update of c2 — and doing so reduces concurrency by creating unnecessary blocking. Instead of using synchronized methods or otherwise using the lock associated with this, we create two objects solely to provide locks.

引自 javadoc.

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

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