问题:当显示器已被锁定时,重新进入同步块的开销是多少?重新进入同步块的开销
例如:
Object lock;
void outer()
{
synchronized (lock)
{
innerOne();
innerTwo();
}
}
void innerOne() { synchronized (lock) { /* ... */ } }
void innerTwo() { synchronized (lock) { /* ... */ } }
的上述意图是innerOne
和innerTwo
而线程上lock
同步总是调用。
如果存在不可忽略的成本,是否有任何方法可以调用以放入assert
声明?我能找到的最接近的电话号码是lock.notify()
,以及IllegalMonitorStateException
,例如
boolean isMonitorHeld(final Object object)
{
try { object.notify(); return true }
catch (final IllegalMonitorStateException e) { return false; }
}
哪想被使用:
void innerOne() { assert isMonitorHeld(lock); /* ... */ }
有没有对两个选项的样式任何意见或任何替代方案?
编辑
我希望更全面的答案不仅仅是“时间,看看”。我没有能力预见我的代码可能遇到的所有潜在情况,然后创建一个测试来展示这些情况。我想了解同步机制如何工作以了解它在不同情况下如何执行。我知道同步可能在不同的平台上以不同的方式实现。在哪种情况下有所不同(主要在Solaris和Linux操作系统上)?
直觉上,我不认为重新进入同步块会有明显的成本,因为我发现的大多数文章都暗示无连锁锁是便宜的。但是,在这些方法中添加同步块并不合适,因为它给人的印象是它们可以被称为,而不是首先在锁上同步。断言提供了一个更好的想法,但它看起来像一个相当丑陋的黑客。我想知道是否有一个很好的理由,没有一个更合理的选择。
你为什么不测量它?如果你*不能测量差异,那么就没有差别。 – skaffman 2012-02-10 09:47:53