您的位置:68399皇家赌场 > 集群主机 > 用亲身经历告诉您,在您的并发程序代码块中,

用亲身经历告诉您,在您的并发程序代码块中,

发布时间:2019-05-06 19:40编辑:集群主机浏览(174)

    用亲身经历告诉您,在你的并发程序代码块中,最佳最佳永不有引用类型,要求的string类型依然得以的。
    现阶段正在把温馨前段日子写的并发程序放到自个儿的类别中,以升高速度,由于本身的种类是与运动对接的,由此,询问了活动的接口能还是不可能响应高并发之后,并且获得了必然的回答,小编就起来初阶demo设计了,但是平昔出错,一直有标题,后来想到,恐怕是援引类型的主题材料,因为本人的出现代码供给不停地给三个类实例对象的某部字段赋值,然后去调用移动接口,小编就估量着,只怕是因为并发太快了,然后那么些引用类型赋值的之后,未有来的及改造内存地址,因为笔者那些类实例对象是大局的,后来自己就改成局地的了,大不断换点内部存款和储蓄器么,小编依旧更爱好速度快点,果然!运转成功,未有出错。
    终极,小编寻思了下,并发中的值类型是最安全的,当然,有时候大家依旧会须要string,此时最佳是把string弄成局地变量,别的的引用类型也是,大家得以把一回现身供给的引用参数想象成二回呼吁,大不断,就是每一回的央浼调用都以采纳部分变量,又能源消耗多少内部存款和储蓄器,再说了大家也能团结手动释放内部存款和储蓄器!

    该随笔受启发于《CL瑞虎 Via C#(第二版)》第陆章四.肆运营时的竞相关联

    一、内部存款和储蓄器分配的几个区域

    1、线程栈

    一部分变量的值类型 和 局地变量中引用类型的指针(或称引用)会被分配到该区域上(引用类型的一片段内部存储器被分配到该区域内)。

    该区域由系统一管理理调控,不受垃圾收集器的垄断。当所在格局施行完结后,局地变量会自行释放(引用类型只释放指针,而不自由指针指向的数目)。

    饭馆的实行效用相当高,但容积有限。

    2、GC Heap(回收堆)

    用来分配小指标(引用类型),要是引用类型的实例大小 小于8陆仟个字节,则会被分配到该区域上。

    3、LOH(Large Object Heap)

    超过 86000个字节的大指标(引用类型)会被分配到该区域上。

    LOH 和 GC Heap差别在于:当有内部存款和储蓄器分配依旧回收时,垃圾搜集器大概会对GC Heap举行削减,而 LOH 不会被减少,只是在垃圾回收时被回收。

     

     

    二、栈桢(stack frame)

    栈桢是落到实处函数调用的数据结构,从逻辑上看,栈桢是一个函数推行的条件(上下文),包蕴:函数参数、重回地址和函数局地变量。

    小心:上述的“重临地址” 不是函数的重返值,而是完毕函数调用后的CPU接下去要施行的代码的岗位。

    越多参见: 维基百科 call stack 

     

    三、浅拷贝 和 深拷贝(Clone、或克隆)

    浅拷贝和深拷贝是内部存款和储蓄器拷贝的二种办法,在传参的进程中国和东瀛常会发生内部存款和储蓄器拷贝并且是浅拷贝,比方上边代码、五个参数正是四次浅拷贝。

            public void Test1()
            {
                string name = "test1";
                int size = 1;
                Test2(name, size);// 两次浅拷贝
            }
    
            public void Test2(string pName, int pSize)
            {
            }
    

     浅拷贝 前后的内部存款和储蓄器结果如下图所示:

    图片 1

    浅拷贝对于值类型(举个例子:int),拷贝的是栈中的具体值。

    浅拷贝对于引用类型(举个例子:string),拷贝的是栈中的引用、其新引用 所指向的 托管堆中的地址 照旧原本的地点。

     

    深拷贝和浅拷贝的分歧在于对 堆中数量(即对象)的拍卖

    浅拷贝只拷贝栈中的引用,不拷贝堆中的对象,新引用指向原有对象。

    深拷贝会拷贝栈中的引用,并且会在堆中创立新的指标,新对象的习性值 “或者” 来源于原有对象(因为、在C#中落实深拷贝必要自身编辑额外的代码,

    即实现 ICloneable 接口,深拷贝的结果是不鲜明的。然而提议我们尽量幸免选取该接口),新引用地址指向新的靶子。因而,深拷贝只针对于引用类型,

    对于值类型未有太多的意义。

     

    四、Demo

    假若说前叁项是做铺垫,那么该德姆o算是正文了。

    优先已经定义好的如下类:

        public class Data 
        {
            public string Name;
            public int Size;
        }
    

    假定代码将在调用Test一函数:

            public void Test1()
            {
                string name = "test1";
                int size = 1;
    
                Data data = new Data() { Name = "test1", Size = 1 };
    
                Test2(name, size, data);
    
                object obj = size;
                int temp = (int)obj;
            }
    
            public void Test2(string pName, int pSize, Data pData)
            {
                pName = "test2";
                pSize = 2;
    
                pData.Name = "test2";
                pData.Size = 2;
    
                pData = new Data() { Name = "test3", Size = 3 };            
            }
    

    此时线程栈和托管堆内的气象如下图所示(图一):

    图片 2

     

    1、初步调用Test1函数,那时会向栈中压入三个栈桢(stack frame)。

      栈桢包涵三部分数目:

      一)函数参数,当然Test一函数没有参数。

      贰)重回地址,在Test1函数中,以当下代码环境为例该地点未有何样实际意义不作表明。

      3)函数局地变量,此时Test壹函数中的全部的1对变量都会被压入栈。 有如下八个部分变量会被压入栈:

    string name, int3二 size, Data data, object obj, int32temp。(当然实际是多少个部分变量,第伍个是编写翻译器自动生成的,在小说结尾处再做解释。)

     压入叁个栈桢后,内部存储器结果如下图所示(图二):

    图片 3

    本文由68399皇家赌场发布于集群主机,转载请注明出处:用亲身经历告诉您,在您的并发程序代码块中,

    关键词: 68399皇家赌场 [01-2].NET-C [00-4]学习笔记 [00-3]其他

上一篇:皇家赌场:django-模板初探,django-初探

下一篇:没有了