Я знаю, что цель volatile переменных в Java заключается в том, что записи в такие переменные сразу видны для других потоков. Я также знаю, что одним из эффектов синхронизированного блока является очистка потоковой локальной памяти от глобальной памяти.
В этом контексте я никогда полностью не понимал ссылки на "поточно-локальную" память. Я понимаю, что данные, которые существуют только в стеке, являются поточно-локальными, но когда речь идет об объектах в куче, мое понимание становится туманным.
Я надеялся получить комментарии по следующим пунктам:
-
При выполнении на компьютере с несколькими процессорами очистка потоковой локальной памяти просто относится к очистке кэша процессора в ОЗУ?
-
При выполнении на однопроцессорной машине это означает что-нибудь вообще?
-
Если куча может иметь одну и ту же переменную в двух разных ячейках памяти (каждый из них обращается к другому потоку), при каких обстоятельствах это может возникнуть? Каковы последствия этого для сбора мусора? Как настойчиво делают виртуальные машины такого рода?
-
(EDIT: добавление вопроса 4) Какие данные удаляются при выходе из синхронизированного блока? Это все, что поток имеет локально? Это только записи, которые были сделаны внутри синхронизированного блока?
Object x = goGetXFromHeap(); // x.f is 1 here Object y = goGetYFromHeap(); // y.f is 11 here Object z = goGetZFromHead(); // z.f is 111 here y.f = 12; synchronized(x) { x.f = 2; z.f = 112; } // will only x be flushed on exit of the block? // will the update to y get flushed? // will the update to z get flushed?
В целом, я думаю, я пытаюсь понять, является ли поточно-локальная память физически доступной только одному процессору или если существует логическое разбиение на кучи на основе нитей, выполняемое виртуальной машиной?
Любые ссылки на презентации или документацию будут чрезвычайно полезны. Я потратил время на изучение этого, и хотя я нашел много хорошей литературы, я не смог удовлетворить свое любопытство в отношении различных ситуаций и определений локальной локальной памяти.
Большое спасибо.