zoukankan      html  css  js  c++  java
  • 线程的本地存储-数据槽、ThreadStatic、ThreadLocal、CallContext

    实现线程的本地存储,也就是线程内可见。这些数据都是存放在线程环境块中,是线程的空间开销

    有以下几种方式:

    线程数据槽:(已过时,建议使用ThreadStaticAttribute)

    static void Main(string[] args)
    {
    var slot = Thread.AllocateDataSlot();//给所有线程分配一个数据槽,存放数据。。。
    
    Thread.SetData(slot, "helloworld");//当前线程设置数据,只有当前线程可读数据
    
    Console.WriteLine(Thread.GetData(slot));//helloworld
    
    var t1 = new Thread(() => {
    Console.WriteLine("t1:"+Thread.GetData(slot));//无数据
    });
    
    t1.Start();
    Console.ReadKey();
    }

    ThreadStaticAttribute:比数据槽性能好,使用方便

    [ThreadStatic]
    static string username = string.Empty;

    ThreadLocal: 也是用来做 线程可见性,它是强类型的

    static void Main(string[] args)
    {
    ThreadLocal<string> local = new ThreadLocal<string>();
    local.Value = "hello world!!!";
    var t = new Thread(() =>
    {
    Console.WriteLine("当前工作线程:{0}", local.Value);
    });
    t.Start();
    Console.WriteLine("主线程:{0}", local.Value);
    Console.Read();
    }

    CallContext 线程内可见。当 CallContext 沿执行代码路径往返传播并且由该路径中的各个对象检查时,可将对象添加到其中。
    使用场景:当对象需要线程内全局使用。Core不支持

    CallContext.SetData(key, temp);
    DbContext temp = CallContext.GetData(key) as DbContext;
  • 相关阅读:
    成绩单问题
    详细介绍Linux shell脚本基础学习(一)
    千万级并发连接的秘密
    前段面试题
    cat 命令
    面试的一个网页设计师
    准备准备
    ls显示文件
    [HDU 1010 ]Tempter of the Bone
    Linux下的绘图(流程图、UML、mindmap)工具
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12957264.html
Copyright © 2011-2022 走看看