作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我创建了一个对象,该对象启动了一个线程,并将其私有(private)实例方法之一提供给 ThreadStart
.后来,对该对象的所有引用都消失了。发生什么了?对象是否永远不会被垃圾回收,因为线程通过 this
持有对它的引用?指针?另一方面,如果我使用静态方法,线程如何检测到它的对象被垃圾回收并结束?
我知道我通常不应该让线程的生命周期依赖于垃圾收集。我不希望我的对象在未正确处理时泄漏。
最佳答案
除了通过委托(delegate)间接持有的任何引用之外,创建线程不持有对对象的直接引用。线程使用 ThreadStart 开始运行,但除了正在运行的委托(delegate)之外,它不持有引用。
如果方法是实例方法,则在线程方法完成之前不会对对象进行垃圾回收。委托(delegate)需要对对象实例的引用,并保持它的根。当线程委托(delegate)完成时,有问题的对象变得无根,并且可以进行垃圾收集。
如果是静态方法,这不是问题。没有对实例的引用——只有类型。启动线程的实例不会被新创建的线程引用 - 因此它将运行直到它的方法完成,然后关闭。实例的垃圾收集处理方式与线程不存在相同(即:当其他引用消失时,该对象将可用于 GC)。
关于.net - 垃圾收集和后台线程如何在 .NET 中交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2066708/
我是一名优秀的程序员,十分优秀!