Что происходит, когда несколько потоков запрашивают одновременную загрузку одного и того же класса?

#java #multithreading #concurrency #classloader

#java #многопоточность #параллелизм #classloader

Вопрос:

В многопоточной среде, когда несколько потоков ссылаются на класс одновременно, загружает ли JVM класс в конечном итоге несколько раз?

Если нет, то как происходит синхронизация?

Комментарии:

1. Я не помню деталей (это есть в спецификации), но класс гарантированно будет загружен ровно один раз. JVM синхронизируется внутри.

2. Многопоточные загрузчики пользовательских классов в Java

3. Вы можете принять один ответ (если это вам поможет), нажав на большую серую кнопку проверки с левой стороны. При желании вы можете добавить 10 баллов любому автору любого хорошего ответа, щелкнув верхний серый треугольник

Ответ №1:

Класс будет загружен один раз. Смотрите jls 12.4.2

Для каждого класса или интерфейса C существует уникальная блокировка инициализации LC. Сопоставление с C на LC оставлено на усмотрение реализации виртуальной машины Java. Тогда процедура инициализации C выглядит следующим образом:

  1. Синхронизация с блокировкой инициализации, LC, для C. Это включает ожидание, пока текущий поток не сможет получить LC.

Комментарии:

1. В блоге Oracle рассказывается о процессе синхронизации после загрузки копии в основную память. Обеспечивает ли JVM синхронизацию на уровне загрузки, я имею в виду загрузку класса из classpath?