Сараван Кумар,
Я понимаю мотивацию вашего вопроса. До того, как я начал работать над компиляторами, у меня также было очень похожее желание узнать внутреннее устройство виртуальной машины Java.
Прежде всего, меня впечатлил ваш вопрос. Чтобы решить ваш вопрос, необходимо несколько отличий и понимания. Во-первых: шаблон Singleton, или иногда даже называемый анти-шаблоном, гарантирует, что существует только один экземпляр этого класса, доступный для JVM (виртуальной машины Java). Это означает, что мы, по сути, вводим глобальное состояние в приложение. Я знаю, что вы это понимаете, но это просто уточнение.
Теперь о внутренностях.
Когда мы создаем экземпляр класса, мы создаем объект, который находится в общей памяти JVM. Теперь эти потоки независимо выполняют код, работающий с этими экземплярами. Каждый поток имеет рабочую память, в которой хранятся данные из основной памяти, которые совместно используются всеми потоками. Здесь находится ссылка на созданный вами объект Singleton. По сути, происходит то, что сгенерированный байт-код, представляющий созданный вами одноэлементный объект, выполняется в каждом из этих потоков.
Теперь внутреннее устройство того, как это происходит, выглядит следующим образом:
Каждый поток JVM имеет частный стек JVM, созданный одновременно с потоком. Теперь у JVM есть куча, которая используется всеми потоками JVM. Куча - это область данных времени выполнения, из которой выделяется память для всех экземпляров классов и массивов. Куча создается при запуске виртуальной машины. Когда ваш поток запрашивает экземпляр синглтона, он будет указывать на ссылку в куче, где находится байт-код для этого синглтона. Собирается выполнить соответствующий код. В вашем случае он будет выполнять первый метод для первого запроса и второй метод для второго запроса. Это возможно, потому что нет никаких блокировок или ограничений, мешающих компилятору указывать счетчик программы на область в куче, где размещен этот экземпляр. Единственное ограничение, которое класс Singleton накладывает на виртуальную машину Java, состоит в том, что он может иметь только один экземпляр в куче этого класса. Это просто так. Помимо этого, вы можете ссылаться на него 100 раз из своего метода, компилятор укажет на тот же байт-код и просто выполнит его. Вот почему мы обычно хотим, чтобы класс Singleton не имел состояния, потому что, если у нас какой-либо поток обращается к нему, мы не хотим, чтобы внутренние переменные изменялись из-за отсутствия контроля параллелизма.
Пожалуйста, дай мне знать, если возникнут какие-либо вопросы!
person
Devarsh Desai
schedule
03.09.2014