Finalizer线程对Object生命周期的影响

这期博客的话题有些沉重,我们来讨论.net对象的生生死死。首先,要给生死下个定义。在这篇博客 中,每当谈及一个对象是死了的对象,指的是用户无法再获得其引用。这个定义是个对用户友好的定义 ,因为有很多时候,对象还残存在托管堆上,CLR依旧可以通过一些手法来获得它(比如RCW缓存中通过 SyncBlk),但是这种“生不如死”的状态不在今天的讨论范围之内。

言归正传。众所周知,.NET倚仗GC管理分配在托管堆上的对象(也就是new出来的东东)。为了提供类 似c++中析构函数的功能,也就是在对象即将死去的时候,执行一段用户代码来做一些清理工作,比如在 一个COM组件上调用它的Release方法。

出于性能的考虑,CLR使用一个独立的线程来执行对象的Finalize方法,所以Finalize方法的执行并 不是GC.Collect的一部分。下面一个程序验证了这个说法。

using System;
using System.Threading;
class ObjectWithFinalizer
{
    ~ObjectWithFinalizer()
    {
        Thread.Sleep(1000);
        Console.WriteLine("Finalize in thread {0}", Thread.CurrentThread.ManagedThreadId);
    }
}

class Program
{
    public static void Main()
    {
        Console.WriteLine("Run in thread {0}", Thread.CurrentThread.ManagedThreadId);
        ObjectWithFinalizer owf = new ObjectWithFinalizer();
        GC.Collect();
        Console.WriteLine("GC.Collect() end");
    }
}

程序的运行结果是

Run in thread 1
GC.Collect() end
Finalize in thread 2

时间: 2024-12-24 02:25:07

Finalizer线程对Object生命周期的影响的相关文章

Android中Activity生命周期和启动模式详解_Android

Activity生命周期经典图解: 按键对生命周期的影响: BACK键: 当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法. 再次启动App时,会执行onCreate()->onStart()->onResume() HOME键: 当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,而当我们按HOME的时候,A

Android中Activity生命周期和启动模式详解

Activity生命周期经典图解: 按键对生命周期的影响: BACK键: 当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法. 再次启动App时,会执行onCreate()->onStart()->onResume() HOME键: 当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,而当我们按HOME的时候,A

实例探究Android应用编写时Fragment的生命周期问题_Android

管理fragment的生命周期有些像管理activity的生命周期.Fragment可以生存在三种状态: Resumed: Fragment在一个运行中的activity中并且可见. Paused: 另一个activity处于最顶层,但是fragment所在的activity并没有被完全覆盖(顶层的activity是半透明的或不占据整个屏幕). Stoped: Fragment不可见.可能是它所在的activity处于stoped状态或是fragment被删除并添加到后退栈中了.此状态的frag

电子商务与营销渠道“生命周期”

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;       营销渠道作为企业经营活动的重要功能,随着环境的变化会面临衰退.消亡.它在产生与消亡之间能够展现出与自然生命相同的生存状态,这种生存状态被称为渠道生命周期.在电子商务环境中,以下因素对渠道生存状态起着决定性的影响作用: 1.渠道模式选择对渠道生命周期的影响(更迭) 电子商务使企业能够直接面对商家销售产品或提供服务,使直销变的可能.但不同地域的的市场格局和本

java的线程机制(二) Thread的生命周期

之前讲到Thread的创建,那是Thread生命周期的第一步,其后就是通过start()方法来启动Thread,它会 执行一些内部的管理工作然后调用Thread的run()方法,此时该Thread就是alive(活跃)的,而且我们还可以通 过isAlive()方法来确定该线程是否启动还是终结. 一旦启动Thread后,我们就只能执行一个方 法:run(),而run()方法就是负责执行Thread的任务,所以终结Thread的方法很简单,就是终结run()方法.仔 细查看文档,我们会发现里面有一个

Java线程的生命周期(转)

  Java线程的生命周期   一个线程的产生是从我们调用了start方法开始进入Runnable状态,即可以被调度运行状态,并没有真正开始运行,调度器可以将CPU分配给它,使线程进入Running状态,真正运行其中的程序代码.线程在运行过程中,有以下几个可能的去向: (1)调度器在某个线程的执行过程中将CPU分配给了其它线程,则这个线程又变为Runnable状态,等待被调度. (2)调度器将CPU分配给了该线程,执行过程中没有遇到任何阻隔,运行完成直接结束,也就是run()方法执行完毕. (3

深入Java线程管理(二):线程的生命周期

Java线程的生命周期 一个线程的产生是从我们调用了start方法开始进入Runnable状态,即可以被调度运行状态,并没有真正开始运行,调度器可以将CPU分配给它,使线程进入Running状态,真正运行其中的程序代码.线程在运行过程中,有以下几个可能的去向: (1)调度器在某个线程的执行过程中将CPU分配给了其它线程,则这个线程又变为Runnable状态,等待被调度. (2)调度器将CPU分配给了该线程,执行过程中没有遇到任何阻隔,运行完成直接结束,也就是run()方法执行完毕. (3)线程在

Linux多线程 创造新线程 线程的生命周期

创造新线程 一.线程的ID pthread_t:结构体(FreeBSD5.2.Mac OS10.3)/unsigned long int(linux)                /usr/include/bits/pthreadtypes.h 获取线程ID:pthread_self() 一个实例:获取主线程ID #include "apue.h" int main(){    pid_t pid;    pthread_t tid;     pid = getpid();    t

Core Java-多线程-线程的生命周期

0. 在介绍线程前我们先看一下什么是进程? 进程是线程的母亲,如果在大学计算机课程里读过操作系统一定不会陌生. 所谓进程,它是计算机程序关于某数据集上的一次活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 罗里吧嗦一大堆,还是不够简洁? 那就一句话来表达吧:进程是正在执行的程序实例.   进程的内存布局 逻辑上一个进程可以划分为以下几部分(段): * 文本: 程序的指令 * 数据: 程序使用的静态变量 * 堆:   程序可以从该区域动态分配额外内存 * 栈:   随函数调用, 返