2016-07-26 2 views
-5

Скажем, у меня есть классJava Многопоточность: изменение переменной из нескольких потоков

public class OuterClass 
{ 
    public static WorkerClass worker; 
} 

В потоке 1

Следующая команда выполняется

Outerclass.worker.doLongRunningOperation(); 

в то время как doLongRunningOperation выполняется в потоке 2

Outerclass.worker = new WokerClass(); 

Что произойдет с doLongRunningOperation в потоке 1?

Будет worker объекта ссылается нитью 1 сборщик мусора, только после того, как doLongRunningOperation завершена или она может быть внезапно прекращена в мусор собирать worker объект.

Edit:

Я не думаю, что это должно быть GC'ed, так как он больше не ссылается. Но что будет с doLongRunningOperation? будет ли оно прекращено внезапно?

+0

Можете ли вы прояснить, что вы думаете, что произойдет и почему? Каковы некоторые причины, по которым это должно быть GC'ed, и каковы некоторые причины этого не следует? –

+0

@SotiriosDelimanolis Я уточнил это в редакции. – q126y

+0

Вы упомянули _ после того, как 'doLongRunningOperation' завершен, поэтому я смущен вашим новым вопросом, будет ли он внезапно прекращен? _ Посмотрите на концепцию корней GC. –

ответ

2

Java-сборщик мусора (GC) высвобождает объекты, которые не прослеживаемы, начиная с набора GC корни. То есть, если объект A ссылается на объект B, а объект B ссылается на объект C, а на объект C ссылается корень , тогда объекты A, B и C безопасны из сборщика мусора.

Итак, каковы корни? Я не знаю полного ответа, но знаю, что корневой набор включает в себя каждую локальную переменную и параметр в каждом запущенном потоке.

Итак, если какая-либо локальная переменная или аргумент в потоке 1 все еще имеет ссылку на исходный экземпляр WorkerClass, то экземпляр будет продолжать жить.

Исходный экземпляр WorkerClass будет исправлен только в том случае, если на него не ссылаются никакие локальные или arg в ни одна из нить или любое поле в любом прослеживаемом объекте. Когда это произойдет, это не будет иметь никакого значения для вашей программы, потому что ваша программа больше не будет иметь никаких средств для доступа к объекту.


приписка, «Аргументы и местные» включают в себя скрытых переменных, которые являются частью реализации Java, и она включает в себя неявном переменной такой как this ссылки в каждом методе объекта. Ваш исходный экземпляр WorkerClass не может быть восстановлен, как долго любой вызов метода на него (например, doLongRunningOperation) все еще активен.

Смежные вопросы