0

完全に満足していない (現在の JVM で許可されている場合はバイアスされている可能性がある) モニターを呼び出すとobject.notifyAll()、特にモニターで実際に待機しているスレッドがない場合、モニターのリバイアスやインフレが発生しますか?

4

1 に答える 1

3

偏ったロックの取り消し (偏った -> 薄い状態の転送) のみが発生します。

ホットスポットのソース コード ( synchronizer.cpp ) を参照する:

void ObjectSynchronizer::notifyall(Handle obj, TRAPS) {
    if (UseBiasedLocking) {
       BiasedLocking::revoke_and_rebias(obj, false, THREAD);
       assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
    }

    markOop mark = obj->mark();
    if (mark->has_locker() && THREAD->is_lock_owned((address)mark->locker())) {
        return;
    }
    ObjectSynchronizer::inflate(THREAD,
                          obj(),
                          inflate_cause_notify)->notifyAll(THREAD);
}

呼び出し元は、ロックがバイアスされているかどうかを確認し (必要に応じてそれを取り消します)、次に確認しますmark->has_locker()(「モニターが薄い」と同じです)。その場合、その待機セットは空であり、インフレやその他の影響なしに高速終了が実行されます (不正な使用の場合is_lock_owned_checkにスローするためだけに実行されます)。IllegalMonitorStateException

また、Java 9 では、notify のエントリ ポイントはJEP 143: Improvement Contended Lockingquick_notifyの一部ですが、とにかく同じチェックを実行することに注意してください。

于 2016-07-10T14:31:39.940 に答える