线程导致竞争条件

时间:2015-11-11 23:41:29

标签: java multithreading race-condition monitor

a threading question

我最初假设这个问题的正确答案是A,因为m2可以被部分使用并且在调用statementB时调用语句C,因为两个锁," a"和" b"如果" b"不要互相保护。在第一个m1中不存在。

C我认为是错误的,因为同步方法并不意味着将类本身用作锁,这样如果m2被同步使用m2,那么什么都不能进入类?

现在我想知道我为C做出的假设是否正确。因为虽然它将自己用作锁,但m1使用b作为锁来保护statementB。这意味着有两个监视器(" B"和#34;这个"),从而允许碰撞使C成为正确的答案?但我也非常确定A也是正确的。

如果您在我的推理中看到任何缺陷或者您是否知道正确的答案以及原因,请告诉我。

1 个答案:

答案 0 :(得分:1)

我会选择A.它消除了操作 statementB; statementC; 的相互排斥,可能会以破坏事物的方式违反它。

B和D是锁定粒度的不可观察的减少,可能会降低性能。

C是锁粒度的可观察更改,可能会导致其他客户端出现问题锁定。 C不是代码行为的重大变化。这是一个棘手的问题。它可能最终在客户端代码中显着,但在本地并不重要。它保留了相互排除陈述的所有原产地保证。

答案绝对是答案。