目前我正在尝试理解Java中的synchronized
在synchronized statements
MsLunch
示例下获取this java doc示例和类c1 and c2
以及两个实例变量{{1 }}
它声明:
例如,假设班级
MsLunch
有两个实例字段c1
和c2
, 永远不会一起使用的。必须同步这些字段的所有更新, 但是没有理由阻止更新c1
与c2
的更新交错 - 这样做可以通过创建不必要的阻塞来减少并发性。
对我来说,这听起来像c1 and c2
不允许一起使用。这就是为什么两个递增c1 and c2
的语句必须同步的原因。 但为什么他们在下一句话中说没有共鸣可以防止更新c1
与c2
的更新交错。这句话对我来说绝对没有意义。首先,他们说他们没有一起使用,现在可以增加c1
,同时增加c2
。
有人可以向我详细说明这一段。
请记住,我不是以英语为母语的人,在理解这个问题时可能会遇到语言问题。
答案 0 :(得分:3)
c1和c2是两个完全独立的计数器。一个线程应该能够增加c1而另一个线程增加c2。如果您只是简单地同步了inc1()和inc2()方法,则在线程2递增c2时会阻止线程1递增c1(反之亦然)。这会对性能产生负面影响。因此,您使用两个单独的锁来同步每个增量。
例如,如果c2的值取决于c1的值,则必须使用单个锁来避免竞争条件。
答案 1 :(得分:0)
必须同步这些字段的所有更新,但是没有 阻止更新
c1
与...交错的原因 更新c2
- 这样做可以通过创建来减少并发性 不必要的阻止而不是使用同步方法或 否则使用与此相关的锁,我们创建两个对象 仅提供锁。
来自javadoc。
他们声明没有理由阻止更新c1
与c2
的更新交错,因为它们之间没有任何关系(它们似乎是独立的)。因此,它们为它们提供了不同的锁定对象,这意味着您可以同时更新c1 and c2
。
我不确定这是否足以让您理解,如果是,请在下面发表评论,以便我们进一步讨论。