質問:モニターが既にロックされているときに同期ブロックを再入力するコストはいくらですか?例えば同期ブロックを再入力するコスト
:
Object lock;
void outer()
{
synchronized (lock)
{
innerOne();
innerTwo();
}
}
void innerOne() { synchronized (lock) { /* ... */ } }
void innerTwo() { synchronized (lock) { /* ... */ } }
上記の目的は、スレッドがlock
に同期させながらinnerOne
とinnerTwo
が常に呼び出されることです。
コストが無視できない場合、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); /* ... */ }
には、2つのオプションのスタイル上の任意のコメント、またはいずれかの選択肢がありますか?
EDIT
私はちょうどより多くの包括的な答えは「時間にそれをして見る」願っています。コードに遭遇する可能性のあるすべての状況を予見し、これらの状況を示すテストを作成する能力はありません。さまざまな状況でどのように動作するかを理解するために、同期メカニズムがどのように機能するかを理解したいと思います。私は、さまざまなプラットフォームで異なる方法で同期を実装できることを理解しています。どのような場合には(主にSolarisとLinux OSで)違いますか?
私は直感的に、私が見つけることができるほとんどの記事が同期していないロックが安価であることを暗示しているので、同期ブロックを再入力するとコストが顕著になるとは思わない。しかし、これらの方法では、と呼ばれる印象を与えるので、ロックで最初に同期されたがなくても、同期されたブロックを追加することは適切ではありません。断言は意図のより良い考えを与えるが、それはかなり醜いハックのように見える。より正当な選択肢がないという正当な理由があるかどうかを知りたいのですが。
なぜ測定しないのですか?あなたが違いを測ることができないなら、それはないのです。 – skaffman