Предположим, что это должно произойти в настоящей параллельной среде, одной VM, в то же время:
// Thread 1:
new Cat()
// Thread 2:
new Dog()
// Thread 3:
new Mouse()
Как JVM обеспечивает безопасность потоков при распределении памяти в куче?
Куча одна для всех потоков и имеет свои собственные внутренние данные.
Для простоты предположим, что простая сборка сборщика мусора, -XX: + UseSerialGC -XX: + UseParallelGC, с простым инкрементным указателем, чтобы отметить начало свободного пространства и одно непрерывное свободное пространство в Eden (куча).
Должна быть какая-то синхронизация между потоками, когда кучное пространство выделяется для экземпляров Cat, Dog и Mouse, иначе они могут легко переписать друг друга. Означает ли это, что каждый новый оператор скрывается внутри некоторых синхронизированных блоков? Таким образом, многие "свободные от блокировки" алгоритмы фактически не блокируются полностью;)
Я предполагаю, что выделение памяти производится самим потоком приложения, синхронно, а не другим выделенным потоком (-ами).
Я знаю TLAB s или Буфер локального распределения потока. Они позволяют потокам иметь отдельные области памяти в Eden для распределения, поэтому синхронизация не требуется. Но я не уверен, что TLAB установлен по умолчанию, это немного непонятная функция HotSpot. Примечание: не путайте переменные TLAB и ThreadLocal
!
Я также предполагаю, что с более сложными сборщиками мусора, такими как G1 или некомпактными сборщиками мусора, необходимо сохранить более сложные данные структуры кучи, например список свободных блоков для CMS, поэтому требуется больше синхронизации.
ОБНОВЛЕНИЕ. Прошу пояснить это. Я принимаю ответ для реализации и вариантов JVM для HotSpot с активным TLAB и без него.
UPDATE: Согласно мой быстрый тест, TLAB установлены по умолчанию, на моем 64-битном JDK 7 для Serial, Параллельные и сборщики мусора CMS, но не для G1 GC.