Java:我是不是需要保护 Thread 对象免受垃圾收集器的影响?

Posted

技术标签:

【中文标题】Java:我是不是需要保护 Thread 对象免受垃圾收集器的影响?【英文标题】:Java: do I need to protect a Thread object from the Garbage Collector?Java:我是否需要保护 Thread 对象免受垃圾收集器的影响? 【发布时间】:2011-03-18 12:16:02 【问题描述】:

之后


Thread t = new Thread();
t.start();

Thread 对象是 GC 的候选对象吗?

【问题讨论】:

澄清一下——这更像是一个理论问题而不是一个实际问题——我不相信即使规范允许,任何人都会实现一个 JVM,其中 Thread 对象将成为 GC 的候选对象在上述情况下。 感谢您对这个问题的耐心等待。 【参考方案1】:

不,它不符合垃圾收集的条件。由于线程被线程调度器调度在可运行队列中(在调用t.start( )之后),它不符合GC的条件。

检查线程是否仍在运行的方法之一是调用thread.isAlive()

final boolean isAlive( )

如果调用它的线程仍在运行,isAlive( ) 方法将返回 true。否则返回 false。 在您的情况下,您可以随时调用t.isAlive() 方法,只是为了检查线程是否处于活动状态。

当线程停止或结束其生命周期或尚未计划运行(如 Jon 的代码片段)时,它就有资格进行 GC。

【讨论】:

"在你的情况下,你总是可以调用 t.isAlive()" - 这个想法是 t 超出了范围,但是应该有一些其他的对 Thread 的引用来避免对象被 GC 'd【参考方案2】:

如果它已启动,则不符合 GC 条件 - 毕竟,正在运行的代码可以请求 Thread.currentThread()

如果你刚刚创建它但没有启动它,像这样:


    Thread pointless = new Thread();

那么我怀疑它有资格进行 GC - 但是不启动线程就创建线程是很不寻常的。 (我想在你开始之前可能会抛出一个异常......)

【讨论】:

我所知道的未启动 Thread 对象的唯一真正用例是使用 Runtime.addShutdownHook() 的关闭挂钩 "如果它启动了,它就不符合 GC 的条件——毕竟,正在运行的代码可以请求 Thread.currentThread()。"这是我的直觉,但我实际上无法从规范中找到确凿的论据 - 例如,实现是否可以使用弱引用来返回当前线程? 规范说可以从任何正在运行的线程访问的对象都会被保留,这包括线程本身。 @Mark:如果它被存储为弱引用,如果它被收集,Thread.currentThread() 会返回什么?空? @Peter 你有推荐给我吗?【参考方案3】:

如果你想在线程完成后保留它,你只需要保护它。它在运行时不能被 GC(或线程使用的任何东西)

【讨论】:

以上是关于Java:我是不是需要保护 Thread 对象免受垃圾收集器的影响?的主要内容,如果未能解决你的问题,请参考以下文章

Android 保护清单和布局免受逆向工程

保护您的 Android 应用免受模拟位置的影响

如何保护对象免受自动释放?

如何保护 Angular 2 SPA 免受 XSS 攻击?

我是不是足够保护我的网站免受 sql 注入?

sql参数保护你免受啥影响?