Обрабатывает ли JVM или базовая ОС изменения состояния потока?

Когда я создаю многопоточную программу и использую такие методы, как Wait или Signal, для управления потоками, среди прочего, контролирует ли JVM все изменения состояния потока или базовая ОС имеет какое-либо отношение к этому.


person Julian    schedule 17.12.2009    source источник


Ответы (3)


Это зависит от реализации JVM. Большинство современных JVM (Suns HotSpot, Oracles JRockit, IBM VM) будут использовать модель многопоточности операционной системы, поскольку это обеспечит наилучшую производительность.

Ранние реализации использовали зеленые потоки — виртуальная машина моделировала потоки, используя себя. Обычно это использовалось, когда платформа или операционная система, на которой он работал, не поддерживали многопоточность. Например, в Java 1.1 Green Threads использовались в Solaris. В то время общепринятой схемой использования нескольких ядер/процессоров в Solaris было использование нескольких процессов, и только позже в операционную систему были добавлены потоки.

Спецификация языка Java не указывает, как должны быть реализованы потоки, но в целом, если ОС поддерживает многопоточность, современные JVM будут использовать реализацию ОС. Когда нет поддержки в ОС, например, на недорогих мобильных телефонах или, например, в реализации карты Java, среда выполнения будет использовать зеленые потоки.

person Robert Christie    schedule 17.12.2009
comment
кроме того, зеленые потоки были полностью удалены из кода Sun java и больше не поддерживаются. В любом случае реализация считалась довольно плохой. - person DragonFax; 17.12.2009
comment
Для всех современных JVM для настольных/серверных компьютеров, да, для недорогих мобильных телефонов или смарт-карт Java они все еще могут использовать зеленые потоки. - person Robert Christie; 17.12.2009

В общем, потоки Java будут отображаться в потоки ОС, а Java будет использовать примитивы синхронизации ОС для реализации synchronized/wait/signal/..., но отображение не так просто, как вы могли бы подумать. На самом деле, JVM использует некоторые хитрые приемы для повышения производительности и реализует большую часть самого кода синхронизации (по крайней мере, в неконкурентном случае).

Если вас действительно интересуют подробности, взгляните на исходный код JVM или на cmeerw.org/notes. /java_sync.html, в котором содержится некоторый обзор того, как примитивы синхронизации Java реализованы в Linux и Solaris.

person cmeerw    schedule 17.12.2009

В первые дни Linux 2.4, по крайней мере, IBM JVM использовала отдельные процессы для реализации потоков Java. Это приводило к длительному переключению между потоками, так как системе нужно было каждый раз активировать совершенно другой процесс.

person Yentz    schedule 17.12.2009