Это немного упрощено, и кое-что из того, что я написал, не совсем правильно, но суть такова:
, поскольку в любой момент времени работает только одна копия JVM,каждый поток требует свою собственную копию JVM?
Не совсем.Вы можете разрешить нескольким потокам читать из одного куска памяти (как по одному адресу в памяти) и, таким образом, иметь только одну JVM.Однако нужно быть осторожным, чтобы потоки не создавали беспорядок при одновременном доступе к таким общим ресурсам (JVM), как это имеет место в реальном мире (представьте, что два человека пытаются одновременно печатать два разных документа).с одним ПК).
Одна стратегия, состоящая в том, чтобы несколько потоков нормально работали вместе с некоторым общим ресурсом (таким как JVM (стек, куча, компилятор байт-кода), консоль, принтер и т. Д.), Действительно имели копии для каждого потока (один компьютеркаждый человек).Например, каждый поток имеет свой собственный стек.
Это, однако, не единственный способ.Например, неизменяемые ресурсы (например, байтовые коды классов в памяти) могут совместно использоваться несколькими потоками через общую память.Если заметка не меняется, два человека могут одновременно безопасно просмотреть эту заметку.Точно так же, поскольку байт-код класса не изменяется, несколько потоков могут читать их одновременно из одной копии.
Другой способ - использовать блокировку для сортировки вещей между потоками (кто бы ни касался мышиполучить, чтобы использовать компьютер).Например, вы можете представить себе JVM, в которой есть только один интерпретатор байтового кода, который используется всеми потоками и защищен одной глобальной блокировкой (что на практике было бы очень неэффективно, но вы поняли идею).
Существует также еще один продвинутый механизм, позволяющий нескольким потокам работать с общими ресурсами.Люди, разработавшие JVM, использовали эти методы, и поэтому вам не нужна копия JVM для каждого потока.