Давайте спросим, что фактически делает виртуальная машина. Я посмотрю OpenJDK.После некоторого копания (исходный код here) мы обнаруживаем, что метод wait реализован этим битом C++.
JVM_ENTRY(void, JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms))
JVMWrapper("JVM_MonitorWait");
Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
assert(obj->is_instance() || obj->is_array(), "JVM_MonitorWait must apply to an object");
JavaThreadInObjectWaitState jtiows(thread, ms != 0);
if (JvmtiExport::should_post_monitor_wait()) {
JvmtiExport::post_monitor_wait((JavaThread *)THREAD, (oop)obj(), ms);
}
ObjectSynchronizer::wait(obj, ms, CHECK);
JVM_END
Что мы следуем вниз следующие определенные для ObjectSynchronizer
void ObjectSynchronizer::waitUninterruptibly (Handle obj, jlong millis, TRAPS) {
if (UseBiasedLocking) {
BiasedLocking::revoke_and_rebias(obj, false, THREAD);
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
}
if (millis < 0) {
TEVENT (wait - throw IAX) ;
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative");
}
ObjectSynchronizer::inflate(THREAD, obj()) -> wait(millis, false, THREAD) ;
}
, а затем в ObjectMonitor
возвращенного inflate
, где мы находим этот воздаем
// Enter the waiting queue, which is a circular doubly linked list in this case
// but it could be a priority queue or any data structure.
и некоторые ObjectWaiter
код, реализующий вышеупомянутый двусвязный список.
Так что я узнал? Ну, во-первых, что код Hotspot на самом деле не так сложно ориентироваться. Но, что более важно для вашего вопроса (в этой реализации JVM), набор ожидания реализован как очередь ... так что потокам дается блокировка на первом в первом порядке. Это означает, что если какие-либо другие потоки ждут блокировки, они получат ее в первую очередь.
Конечно, мы никогда не должны использовать эту информацию ... поскольку вышеприведенный комментарий говорит, что список ожидания может быть реализован, однако люди JVM хотят его реализовать. JLS не указывает на порядок, в котором потоки должны быть уведомлены. Но я узнал что-то, если никто не имеет.
Приложение, основанное на справедливости для корректности, плохо спроектировано. Но приложение может также полагаться на справедливость (в среднем) минимизировать время выполнения. –