zoukankan      html  css  js  c++  java
  • [C#学习笔记]类型对象指针和同步块索引

    写在前面

    看《CLR via C#》第四章时,看到了类型对象指针和同步块索引这两个概念,不知如何解释,查看过相关资料之后,在此记录。

    类型对象指针

    《CLR via C#》中的原话:

    任何时候在堆上创建对象,CLR都自动初始化内部的“类型对象指针”成员来引用 与对象对应的类型对象。

    在JIT编译器将IL代码转换成本机CPU指令的时候,利用程序集的元数据,CLR提取与代码中类型有关的信息,创建一些数据结构来表示类型本身。

    CLR开始在一个进程中运行时,利用MSCorLib.dll中定义的System.Type类型创建一个特殊的类型对象,代码中的类型对象都是该类型的“实例”,因此,它们的类型对象指针成员会初始化成对的System.Type类型对象的引用

    System.Object的GetType方法返回存储在指定对象的“类型对象指针”成员中的地址。也就是说,GetType方法返回指向对象的类型对象的指针。这样就可以判断系统中任何对象(包括类型对象本身)的真实类型。

    同步块索引

    先看如下图:

    首先,CLR创建类Manager,在内存中分配 类Manager 所占用的空间,当创建Manager的实例M1的时候,M1的类型对象指针就指向Manager。

    当用lock来锁定M1的时候,M1的同步块索引就指向一个同步块(这里说明一下同步块,CLR负责创建同步块,可以把它理解为一个数组,数组中的每一个元素就是一个同步块)。

    M1的同步块索引初始为一个负数,表示M1没有同步,当用lock的时候,CLR负责在同步块数组中寻找空闲的同步块,并把M1的同步块索引被设置为一个整数S,S为找到的同步块在同步块数组中的索引。

    当lock结束之后,M1的同步块索引又被重新设置为负数。

     

     

    关于lock的一些有关概念,可以看我的上一篇博客。

    写在最后

    总结:

    1、好好钻研《CLR via C#》这本书!很多有意思的知识,可以深入的理解C#的运行机制。

    2、.NET真是太棒了。

  • 相关阅读:
    CSS
    Form表单
    HTML入门(HB、DW)
    第一次接触HBuild
    python 数据结构中被忽视的小技巧
    flask扩展模块flask-sqlachemy 的使用---mysql数据库
    flask蓝图的使用
    基于爬虫的天气预报程序
    一个爬取股票信息的爬虫程序
    向python3进发
  • 原文地址:https://www.cnblogs.com/knqiufan/p/10475186.html
Copyright © 2011-2022 走看看