Когда поток выполняет метод meth1 (), где создается карта? в куче?
Да. Все, что вы создаете с помощью new Whatever()
, сохраняется в куче, как экземпляр OtherClass
, так и его HashMap
(поскольку его инициализация включает выражение new HashMap<>()
). И каждый раз, когда вы выполняете new Whatever()
, вы получаете полностью свободный sh экземпляр в куче.
Есть ли проблемы с безопасностью потоков относительно карты, объявленной как переменная экземпляра.
Нет, не в вашем примере. Только если несколько потоков обращаются к одному и тому же экземпляру OtherClass
, безопасность потоков может стать проблемой. В вашем случае каждый поток выполнения создает свой индивидуальный экземпляр OtherClass
(в локальной переменной other
), использует только этот и не передает его в какое-либо место, где его может увидеть другой поток.
Когда локальная переменная собирает мусор, я предполагаю, что карта также собирает мусор.
Да, если вы не добавляете код, который передает карту какой-либо другой части программного обеспечения.
Экземпляры собираются мусором, когда на них больше не ссылается любая «живая» переменная / параметр / объект / ... В вашем случае на ops
HashMap ссылается (сохраняется) только поле ops
включающего его экземпляра OtherClass
. Итак, когда этот экземпляр больше недоступен, карта также становится недоступной и, следовательно, готовой к сборке мусора. запланировано каким-то тщательно продуманным оптимизированным алгоритмом. Единственное, в чем вы можете быть уверены, это то, что это произойдет до того, как у вас закончится память. - сценарий небольшой разницы
Это верно только в противоположном направлении: вы не можете столкнуться с проблемами потоковой безопасности / повреждения данных, если у вас нет полей экземпляра или класса.
True is: если вы используете поля экземпляра или класса в многопоточной настройке, вы должны быть осторожны. Но, например, поля экземпляра, доступные только для чтения (те, которые вы задаете только в конструкторе и никогда не изменяете позже), как правило, безопасны.