多线程和并发管理 .NET多线程服务
线程相关静态变量
默认静态变量应用程序域所有线程可见。如果静态变量需要在线程间共享,同步访问也就必然了。
线程相关静态变量保证线程安全,同一时间只有一个线程可访问,且每个线程都有该静态变量的拷贝。
- public class MyClass
- {
- //.NET支持线程相关静态变量
- //该特性只可修饰类的静态成员变量,不能用于属性,方法
- [ThreadStatic]
- private static m_MyString;
- public static string MyString
- {
- set { m_MyString = value; }
- get { return m_MyString; }
- }
- }
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对象),用来存储对象。分为:命名槽(一定要显示释放),未命名槽(垃圾回收器自动释放)。
命名槽:
- 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);
- }
- }
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);
}
}
未命名槽:
- //共享该对象
- 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);
- }
- }
//共享该对象
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个。
多线程和并发管理 .NET多线程服务的更多相关文章
- Java多线程与并发基础
CS-LogN思维导图:记录专业基础 面试题 开源地址:https://github.com/FISHers6/CS-LogN 多线程与并发基础 实现多线程 面试题1:有几种实现线程的方法,分别是什么 ...
- Java 并发性和多线程
一.介绍 在过去单 CPU 时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个 ...
- python 并发编程之多线程
一.线程理论 1.什么是线程 多线程(即多个控制线程)的概念是,在一个进程中存在多个线程,多个线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源. 所以,进程只是用来把资 ...
- 30 python 并发编程之多线程
一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python ...
- 百万年薪python之路 -- 并发编程之 多线程 二
1. 死锁现象与递归锁 进程也有死锁与递归锁,进程的死锁和递归锁与线程的死锁递归锁同理. 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,在无外力的作用 ...
- Java 多线程与并发【原理第二部分笔记】
Java 多线程与并发[原理第二部分笔记] 什么是Java内存模型中的happens-before Java内存模型,即JMM,本身是一种抽象的概念,并不是真实存在的,他描述的是一组规则或者说是一种规 ...
- JAVA 多线程和并发学习笔记(三)
Java并发编程中使用Executors类创建和管理线程的用法 1.类 Executors Executors类可以看做一个“工具类”.援引JDK1.6 API中的介绍: 此包中所定义的 Execut ...
- java 并发性和多线程 -- 读感 (一 线程的基本概念部分)
1.目录略览 线程的基本概念:介绍线程的优点,代价,并发编程的模型.如何创建运行java 线程. 线程间通讯的机制:竞态条件与临界区,线程安全和共享资源与不可变性.java内存模型 ...
- JAVA多线程和并发基础面试问答(转载)
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
随机推荐
- ipython, 一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数
一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数. 若用的是fish s ...
- 第三百三十天 how can I 坚持
今天是姥姥二周年,不是忘了,是根本就没不知道,没放在心上,正月十九,记下了,人这一辈子. 搞不懂,搞不懂那签. 锥地求泉,先难后易,顺其自然,偶遇知己,携手同行,是签文的关键,我逐个解释给你听.锥地求 ...
- Objective-C 学习笔记(1)
文件描述: .h 类的声明文件,用户声明变量.函数(方法) .m 类的实现文件,用户实现.h中的函数(方法) 类的声明使用关键字 @interface.@end 类的实现使用关键字@implement ...
- Unix 哲学
1.模块原则:使用简洁的接口拼接简单的部件 2.清晰原则:清晰胜于机巧 3.组合原则:设计时考虑拼接组合 4.分离原则:策略同机制分离,接口同引擎分离. 5.简洁原则:设计要简洁,复杂度能低则低 6. ...
- JQuery点击收起,点击展开以及部分非空小验证
<tr> <td nowrap align="right" width="18%"> 解决方案: </td> <td ...
- HDU 2859 Phalanx (dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 给你一个n*n的矩阵,问你最大的对称度是多少(左下右上为对称线) dp[i][j]表示i行j列元 ...
- C#取得当前目录 转载
/获取包含清单的已加载文件的路径或 UNC 位置. public static string sApplicationPath = Assembly.GetExecutingAssem ...
- linux自启动服务方式
方式一: /etc/init.d/servicename restart 编写 /etc/init.d/ 下面的标准的服务shell脚本 方式二: vim /etc/rc.local /home/ ...
- SpringMVC3.2+JPA使用注解的方式环境搭建
==============================entity=========================================================package ...
- Apache Kafka:下一代分布式消息系统
[http://www.infoq.com/cn/articles/apache-kafka/]分布式发布-订阅消息系统. Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交日 ...