同步语句,不清楚java doc示例

时间:2015-06-05 09:56:19

标签: java synchronized

目前我正在尝试理解Java中的synchronizedsynchronized statements MsLunch示例下获取this java doc示例和类c1 and c2以及两个实例变量{{1 }}

它声明:

  

例如,假设班级MsLunch有两个实例字段c1c2,       永远不会一起使用的。必须同步这些字段的所有更新,       但是没有理由阻止更新c1c2的更新交错 -       这样做可以通过创建不必要的阻塞来减少并发性。

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

有人可以向我详细说明这一段。

请记住,我不是以英语为母语的人,在理解这个问题时可能会遇到语言问题。

2 个答案:

答案 0 :(得分:3)

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

例如,如果c2的值取决于c1的值,则必须使用单个锁来避免竞争条件。

答案 1 :(得分:0)

  

必须同步这些字段的所有更新,但是没有   阻止更新c1与...交错的原因   更新c2 - 这样做可以通过创建来减少并发性   不必要的阻止而不是使用同步方法或   否则使用与此相关的锁,我们创建两个对象   仅提供锁。

来自javadoc

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

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