Когда я создаю многопоточную программу и использую такие методы, как Wait или Signal, для управления потоками, среди прочего, контролирует ли JVM все изменения состояния потока или базовая ОС имеет какое-либо отношение к этому.
Обрабатывает ли JVM или базовая ОС изменения состояния потока?
Ответы (3)
Это зависит от реализации JVM. Большинство современных JVM (Suns HotSpot, Oracles JRockit, IBM VM) будут использовать модель многопоточности операционной системы, поскольку это обеспечит наилучшую производительность.
Ранние реализации использовали зеленые потоки — виртуальная машина моделировала потоки, используя себя. Обычно это использовалось, когда платформа или операционная система, на которой он работал, не поддерживали многопоточность. Например, в Java 1.1 Green Threads использовались в Solaris. В то время общепринятой схемой использования нескольких ядер/процессоров в Solaris было использование нескольких процессов, и только позже в операционную систему были добавлены потоки.
Спецификация языка Java не указывает, как должны быть реализованы потоки, но в целом, если ОС поддерживает многопоточность, современные JVM будут использовать реализацию ОС. Когда нет поддержки в ОС, например, на недорогих мобильных телефонах или, например, в реализации карты Java, среда выполнения будет использовать зеленые потоки.
В общем, потоки Java будут отображаться в потоки ОС, а Java будет использовать примитивы синхронизации ОС для реализации synchronized/wait/signal/..., но отображение не так просто, как вы могли бы подумать. На самом деле, JVM использует некоторые хитрые приемы для повышения производительности и реализует большую часть самого кода синхронизации (по крайней мере, в неконкурентном случае).
Если вас действительно интересуют подробности, взгляните на исходный код JVM или на cmeerw.org/notes. /java_sync.html, в котором содержится некоторый обзор того, как примитивы синхронизации Java реализованы в Linux и Solaris.
В первые дни Linux 2.4, по крайней мере, IBM JVM использовала отдельные процессы для реализации потоков Java. Это приводило к длительному переключению между потоками, так как системе нужно было каждый раз активировать совершенно другой процесс.