object.notifyAll()
을 완전히 무의미한 (현재 JVM에 허용되면 편향 될 수 있음) 모니터로 호출하면 특히 모니터에서 실제로 대기중인 스레드가없는 경우 모니터 재조정 및/또는 인플레이션이 발생합니까?object.notifyAll()을 호출하면 핫스팟 JVM에서 잠금 재조정/인플레이션이 발생합니까?
0
A
답변
2
바이어스 된 잠금 해지 (바이어스 됨 -> 씬 상태 전송) 만 발생합니다. 핫스팟 소스 코드 (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()
(이것은 "박막 모니터이다"와 같은 'S) 검사한다. 그렇다면 대기 세트가 비어 있고 인플레이션이나 다른 효과없이 빠른 종료가 수행됩니다 (is_lock_owned_check
은 불법 사용의 경우에만 IllegalMonitorStateException
을 던집니다).
알림을위한 Java 9 진입 점에서는 quick_notify
이 JEP 143: Improve Contended Locking의 일부로 표시되지만 동일한 체크가 수행됩니다.