Обрабатывает ли JVM или базовая ОС изменения состояния потока - PullRequest
5 голосов
/ 17 декабря 2009

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

Ответы [ 3 ]

11 голосов
/ 17 декабря 2009

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

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

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

3 голосов
/ 17 декабря 2009

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

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

2 голосов
/ 17 декабря 2009

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

...