java – 线程导致竞争条件

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

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

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

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

最佳答案 我会选择A.它删除了操作语句B的互斥;和声明C;可能以破坏事物的方式违反它.

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

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

答案绝对是答案.

点赞