线程相关静态变量

默认静态变量应用程序域所有线程可见。如果静态变量需要在线程间共享,同步访问也就必然了。

线程相关静态变量保证线程安全,同一时间只有一个线程可访问,且每个线程都有该静态变量的拷贝。

[csharp] view plaincopyprint?
  1. public class MyClass
  2. {
  3. //.NET支持线程相关静态变量
  4. //该特性只可修饰类的静态成员变量,不能用于属性,方法
  5. [ThreadStatic]
  6. private static m_MyString;
  7. public static string MyString
  8. {
  9. set { m_MyString = value; }
  10. get { return m_MyString; }
  11. }
  12. }
public class MyClass
{//.NET支持线程相关静态变量//该特性只可修饰类的静态成员变量,不能用于属性,方法[ThreadStatic]private static m_MyString;public static string MyString{set { m_MyString = value; }get { return m_MyString; }}
}

线程本地存储(TLS)

全局托管堆上分配的对象对于所有应用程序域的所有线程都可见可访问(因此需要同步访问机制)。

.NET提供了线程专用堆TLS,无需同步那些分配到TLS上的对象访问,因为只有一个线程可以访问他们。

TLS提供了槽(LocalDataStoreSlot对象),用来存储对象。分为:命名槽(一定要显示释放),未命名槽(垃圾回收器自动释放)。

命名槽:

[csharp] view plaincopyprint?
  1. Thread.CurrentThread.Name = "66";
  2. int number = 8;
  3. //显示释放命名槽
  4. Thread.FreeNamedDataSlot("My_TLS_Slot");
  5. //在当前线程上分配一命名槽
  6. LocalDataStoreSlot dataSlot = Thread.AllocateNamedDataSlot("My_TLS_Slot");
  7. //在当前线程上将数据存入命名槽(只有当前线程中的成员才可以访问)
  8. Thread.SetData(dataSlot, 8);
  9. //新建另一线程
  10. Thread thread = new Thread(GetData_2);
  11. thread.Name = "lulu";
  12. thread.Start();
  13. GetData();
  14. private void GetData()
  15. {
  16. object obj;
  17. //获取当前线程命名槽
  18. LocalDataStoreSlot dataSlot = Thread.GetNamedDataSlot("My_TLS_Slot");
  19. //获取当前线程槽中存储的值
  20. obj = Thread.GetData(dataSlot);
  21. int number = (int)obj;
  22. //输出:66 , 8
  23. //说明槽中数据只由创建槽的线程访问(只有一个线程可访问)
  24. Response.Write(Thread.CurrentThread.Name + " , " + number);
  25. }
  26. private void GetData_2()
  27. {
  28. object obj;
  29. LocalDataStoreSlot dataSlot = Thread.GetNamedDataSlot("My_TLS_Slot");
  30. obj = Thread.GetData(dataSlot);
  31. //输出:lulu
  32. //说明访问不到槽中数据,因为当前方法由另一线程调用
  33. if (obj == null)
  34. {
  35. Response.Write(Thread.CurrentThread.Name);
  36. }
  37. }
Thread.CurrentThread.Name = "66";int number = 8;
//显示释放命名槽
Thread.FreeNamedDataSlot("My_TLS_Slot");
//在当前线程上分配一命名槽
LocalDataStoreSlot dataSlot = Thread.AllocateNamedDataSlot("My_TLS_Slot");
//在当前线程上将数据存入命名槽(只有当前线程中的成员才可以访问)
Thread.SetData(dataSlot, 8);//新建另一线程
Thread thread = new Thread(GetData_2);
thread.Name = "lulu";
thread.Start();GetData();private void GetData()
{object obj;//获取当前线程命名槽LocalDataStoreSlot dataSlot = Thread.GetNamedDataSlot("My_TLS_Slot");//获取当前线程槽中存储的值obj = Thread.GetData(dataSlot);int number = (int)obj;//输出:66 , 8//说明槽中数据只由创建槽的线程访问(只有一个线程可访问)Response.Write(Thread.CurrentThread.Name + " , " + number);
}private void GetData_2()
{object obj;LocalDataStoreSlot dataSlot = Thread.GetNamedDataSlot("My_TLS_Slot");obj = Thread.GetData(dataSlot);//输出:lulu//说明访问不到槽中数据,因为当前方法由另一线程调用if (obj == null){Response.Write(Thread.CurrentThread.Name);}
}

未命名槽:

[csharp] view plaincopyprint?
  1. //共享该对象
  2. private LocalDataStoreSlot dataSlot;
  3. protected void Page_Load(object sender, EventArgs e)
  4. {
  5. Thread.CurrentThread.Name = "66";
  6. //在当前线程上分配一未命名槽(由垃圾回收器释放,无需显示释放)
  7. dataSlot = Thread.AllocateDataSlot();
  8. //在当前线程上将数据存入未命名槽(只有当前线程中的成员才可以访问)
  9. Thread.SetData(dataSlot, 8);
  10. //创建一新线程
  11. Thread thread = new Thread(GetData_2);
  12. thread.Name = "lulu";
  13. thread.Start();
  14. GetData();
  15. }
  16. private void GetData()
  17. {
  18. //获取当前线程未命名槽中值
  19. object obj = Thread.GetData(dataSlot);
  20. Response.Write(Thread.CurrentThread.Name + " , " + (int)obj);
  21. }
  22. private void GetData_2()
  23. {
  24. object obj = Thread.GetData(dataSlot);
  25. if (obj == null)
  26. {
  27. Response.Write(Thread.CurrentThread.Name);
  28. }
  29. }
//共享该对象
private LocalDataStoreSlot dataSlot;protected void Page_Load(object sender, EventArgs e)
{Thread.CurrentThread.Name = "66";//在当前线程上分配一未命名槽(由垃圾回收器释放,无需显示释放)dataSlot = Thread.AllocateDataSlot();//在当前线程上将数据存入未命名槽(只有当前线程中的成员才可以访问)Thread.SetData(dataSlot, 8);//创建一新线程Thread thread = new Thread(GetData_2);thread.Name = "lulu";thread.Start();GetData();
}private void GetData()
{//获取当前线程未命名槽中值object obj = Thread.GetData(dataSlot);Response.Write(Thread.CurrentThread.Name + " , " + (int)obj);
}private void GetData_2()
{object obj = Thread.GetData(dataSlot);if (obj == null){Response.Write(Thread.CurrentThread.Name);}
}

线程池

由.NET管理,包含一组线程随时准备为应用程序的请求服务(异步调用,远程调用,计时器调用都用到线程池)。可通过ThreadPool静态类访问。

线程池中实际有2种线程:工作线程,完成端口线程。

默认情况下,线程池工作线程最大数是每个CPU每个进程25个。

转载于:https://www.cnblogs.com/amylis_chen/p/3245644.html

多线程和并发管理 .NET多线程服务相关推荐

  1. python模拟并发是多线程_Python并发编程之多线程

    目录 一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资 ...

  2. JAVA多线程和并发基础面试问答

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在 ...

  3. 并发基础篇(一): Java 并发性和多线程

    说在前面 介绍文章之前,先给出一个多线程的思维导图, 后续的文章就根据思维导图来一步一步的分析java多线程的知识. 一.介绍 在过去单 CPU 时代,单任务在一个时间点只能执行单一程序.之后发展到多 ...

  4. java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!

    点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! ​ 在介绍本书单之前,我想先问一下各位读者,你们之前对于Java并发编程的了解有多少呢.经过了1 ...

  5. java多线程与并发原理

    三.java多线程与并发原理 1.进程和线程的区别: 进程和线程的由来: (1)串行:初期的计算机只能串行执行任务,并且需要长时间等待用户输入: (2)批处理:预先将用户的指令集集中成清单,批量串行处 ...

  6. Java多线程与并发相关 — 原理

    Java多线程与并发相关 - 原理 一 synchronized同步 1. 线程安全问题的主要诱因? 存在共享资源(也称临界资源); 存在多条线程共同操作这些共享数据; 2. 解决办法. 同一时刻有且 ...

  7. Java多线程与并发库高级应用架构

    张孝祥_Java多线程与并发库高级应用 [视频介绍:] Java线程是一项非常基本和重要的技术,在偏底层和偏技术的Java程序中不可避免地要使用到Java线程技术,特别是android手机程序和游戏开 ...

  8. Java多线程和并发问题集

    并发是指什么 并发是程序同时执行多个计算的能力. 这可以通过将计算分布在机器的可用CPU内核上(多核CPU支持)或甚至通过同一网络内的不同机器来实现(后台分布式). 进程和线程有什么区别 进程是操作系 ...

  9. Java设计思想深究----多线程与并发(图文)

    本文很长很长,对原理深入至内存层面,以顺序结构讲述集合框架的设计故事,请耐心阅读顺序阅读 或 挑选疑惑点阅读. 目录结构太大,导致点击后索引到内容末尾,需要查看上滑或下滑即可. 目录 一切的缘起是昂贵 ...

  10. 进程线程、同步异步、阻塞非阻塞、并发并行、多线程

    一: 进程和线程 1: 进程(Process) 是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程.线 ...

最新文章

  1. Ajax Control Toolkit 34个服务器端控件 详解
  2. Java线程:线程栈模型与线程的变量
  3. Linux学习:shell 命令(压缩包管理)
  4. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-7主节点CM安装子节点Agent配置...
  5. JavaScript闭包小窥
  6. 三分钟了解 Python3 的异步 Web 框架 FastAPI
  7. tensor转换为图片_为大家介绍图片转换pdf的经验总结!你找对方法了吗?
  8. Android 应用开发(37)---RelativeLayout(相对布局)
  9. ESXi 中重新启动管理代理
  10. 天津理工大学计算机考研录取名单,2020年天津理工大学硕士研究生拟录取名单公示...
  11. 实现模拟内存动态分区分配算法_你还在为了JVM而烦恼么?(内存结构和垃圾回收算法)...
  12. Eclipse ADT插件和主题
  13. 表情键盘 EmojiKeyboard
  14. Radon变换与Matlab代码
  15. android烧写固定MAC,小系统SN号和MAC地址快速烧录的方法与流程
  16. AndroidX使用
  17. 2012年10月第3周(10.15-10.21)
  18. 历史性一刻,中国航天器首次登上火星!!!
  19. 待我兵临城下,许你半世繁华
  20. 498 对角线遍历(找规律)

热门文章

  1. mysql版本问题,最近多次遇到的坑
  2. snprintf与sprintf的区别
  3. docker学习记录 docker 脚本----redis,zookeeper,kafka(三)
  4. 用c语言编写成绩单由高到低,C语言程序设计实验.doc
  5. 冒泡排序及其稳定性介绍
  6. php mysql随机抽奖源码_PHP随机按百分比抽奖
  7. neo4j入门(一)概述
  8. MySQL 8.0窗口函数介绍(一)
  9. 利用JAVA Service Wrapper把JAVA程序做成windows服务
  10. 论文阅读-多任务(2021)-YOLOP:用于自动驾驶目标检测与语义分割的实时多任务模型