Java Переменная экземпляра, указанная в локальной переменной. Память, безопасность потоков и финализация - PullRequest
0 голосов
/ 07 мая 2020

У меня есть класс MyClass, у которого есть метод с переменной - экземпляр OtherClass, как показано ниже

public class Myclass{ 
   public void meth1(){
 
  OtherClass other = new OtherClass();  
    other.perform();
     
    }

}

public class OtherClass{

private Map<String, String> ops = new HashMap<>();

public void perform(){

  // put/ remove values in ops 
    }

} 

Это многопоточная среда Когда поток выполняет метод meth1 (), где Map - это создан? в куче? Есть ли проблемы с безопасностью потоков по отношению к карте, объявленной как переменная экземпляра. Когда локальная переменная собирается сборщиком мусора, я предполагаю, что карта также собирает мусор. Пожалуйста, поправьте, если я ошибаюсь.

Примечание: я знаю, что при наличии переменных экземпляра в многопоточной среде возможны повреждения данных. Однако это немного отличается от сценария.

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Когда поток выполняет метод meth1 (), где создается карта? в куче?

Да. Все, что вы создаете с помощью new Whatever(), сохраняется в куче, как экземпляр OtherClass, так и его HashMap (поскольку его инициализация включает выражение new HashMap<>()). И каждый раз, когда вы выполняете new Whatever(), вы получаете полностью свободный sh экземпляр в куче.

Есть ли проблемы с безопасностью потоков относительно карты, объявленной как переменная экземпляра.

Нет, не в вашем примере. Только если несколько потоков обращаются к одному и тому же экземпляру OtherClass, безопасность потоков может стать проблемой. В вашем случае каждый поток выполнения создает свой индивидуальный экземпляр OtherClass (в локальной переменной other), использует только этот и не передает его в какое-либо место, где его может увидеть другой поток.

Когда локальная переменная собирает мусор, я предполагаю, что карта также собирает мусор.

Да, если вы не добавляете код, который передает карту какой-либо другой части программного обеспечения.

Экземпляры собираются мусором, когда на них больше не ссылается любая «живая» переменная / параметр / объект / ... В вашем случае на ops HashMap ссылается (сохраняется) только поле ops включающего его экземпляра OtherClass. Итак, когда этот экземпляр больше недоступен, карта также становится недоступной и, следовательно, готовой к сборке мусора. запланировано каким-то тщательно продуманным оптимизированным алгоритмом. Единственное, в чем вы можете быть уверены, это то, что это произойдет до того, как у вас закончится память. - сценарий небольшой разницы

Это верно только в противоположном направлении: вы не можете столкнуться с проблемами потоковой безопасности / повреждения данных, если у вас нет полей экземпляра или класса.

True is: если вы используете поля экземпляра или класса в многопоточной настройке, вы должны быть осторожны. Но, например, поля экземпляра, доступные только для чтения (те, которые вы задаете только в конструкторе и никогда не изменяете позже), как правило, безопасны.

1 голос
/ 07 мая 2020

Объект OtherClass будет создан в куче, и ссылка на него будет создана в стеке. Благодаря stack confinement этот код полностью потокобезопасен. Проблемы безопасности потоков возникают только тогда, когда состояние объекта совместно используется несколькими потоками. Поскольку к этому объекту может получить доступ только поток, вызывающий метод, он не используется совместно. Как только стек выскочит, объект будет обработан сборщиком мусора.

...