Учитывает ли java GC ссылки, сделанные в другом потоке? - PullRequest
0 голосов
/ 11 октября 2018

Предположим, локальная переменная определена, а затем передана в конструктор Thread, где она сохраняется как приватное поле этого потока.Затем поток запускается непрерывно (по сути, навсегда), в то время как оригинальный метод заканчивается.

Ссылка на локальную переменную исчезла, но учитывает ли GC ссылку, сохраненную объектом Thread?

Мой сценарий похож на этот пример:

...

public static void Main(String... args) {
  Foo foo = new Foo()
  MyThread thread = new MyThread(foo)
  ExecutorService executor = Executors.newSingleThreadExecutor();
  executor.execute(thread)
}

...

public class MyThread implements Runnable {

  private Foo foo;

  public MyThread(Foo foo) {
     this.foo = foo;
  }

  public void run() {
     while (true) {
         this.foo.print(); // << throws NullPointerException
         sleep(...)
     }
  }
}

1 Ответ

0 голосов
/ 11 октября 2018

Вкратце, да, GC учитывает ссылку, хранящуюся в классе MyThread, и не удаляет ссылочный объект. Это связано с тем, что Javaсборщик мусора будет уничтожать только недоступные объекты, то есть объекты, на которые нет ссылок нигде в вашем коде (не совсем общее правило, посмотрите на слабые ссылки ).

Переменнаяfoo не фактический объект, а скорее ссылка на него.Когда вы передаете foo конструктору MyThread, вы передаете не объект, а ссылку на него.Внутри конструктора вы копируете эту ссылку и сохраняете ее внутри переменной-члена MyThread.Так как метод run() этого класса будет выполняться «навсегда» (что означает, что экземпляр MyThread «жив»), рассматриваемая ссылка будет жить «навсегда», тем самым предотвращая сборку мусора ссылочным объектом.

Обратите внимание, что имя MyThread неверно, так сказать.Он не распространяется Thread и, следовательно, не является потоком.Это просто реализация интерфейса Runnable.Более точное имя будет MyRunnable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...