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

C我认为是错误的,因为同步方法不意味着将类本身用作锁,这样,如果在同步时使用了m2,则什么也无法进入该类?

现在我想知道我对C所做的假设是否正确。因为尽管m1本身将其用作锁,但m1仍将b用作锁来保护statementB。这意味着有两个监视器(“B”和“this”),从而允许发生冲突,从而使C成为正确答案?但是我也很确定A也正确。

如果您发现我的推理有任何缺陷,或者知道正确的答案以及原因,请告诉我。

最佳答案

我会选择A。它将删除操作 statementB的互斥; 语句C; 可能以破坏事物的方式违反了它。

B和D是锁粒度无法观察到的减少,这可能会降低性能。

C是锁粒度上的一个可观察到的变化,它可能暴露其他客户端存在问题的锁。 C在此代码的行为方面没有重大变化。这是一个技巧问题。它可能在客户端代码中很重要,但在本地不重要。它保留了所有相互排斥陈述的原产地保证。

绝对是答案。

09-26 22:56