2019-8-31-dotnet-线程静态字段
title | author | date | CreateTime | categories |
---|---|---|---|---|
dotnet 线程静态字段
|
lindexi
|
2019-08-31 16:55:58 +0800
|
2019-06-13 08:58:47 +0800
|
dotnet
|
在 dotnet 程序提供了一个好用的特性,可以让字段作为线程的静态字段,也就是在相同线程的所有代码访问的静态字段是相同对象,但不同线程访问的时候是不同的
在 .NET 程序可以使用 ThreadStaticAttribute 特性标记在一个静态字段上,这样这个字段就可以做到在线程里面静态
在一个类的静态字段上面添加 ThreadStaticAttribute 可以让这个字段作为线程的静态字段,也就是在相同的线程访问的时候这个字段是静态的,拿到的对象的实例相同,但是在不同的线程拿到不相同
在 ThreadStaticAttribute 支持的只有静态字段,不支持静态属性,不支持普通的字段。同时添加了这个特性的静态字段不支持初始化
下面写一段代码尝试一下
class Foo
{
public static string StaticProperty
{
get => _staticProperty;
set => _staticProperty = value;
} public static string ThreadStaticProperty
{
get => _threadStaticProperty;
set => _threadStaticProperty = value;
} [ThreadStatic] private static string _threadStaticProperty = "初始值";
private static string _staticProperty = "初始值";
}
我在一个类创建了两个不同的静态属性,一个是普通的静态属性,另一个是线程静态属性,我尝试都给两个字段初始值
static void Main(string[] args)
{
Foo.StaticProperty = "普通静态属性";
Foo.ThreadStaticProperty = "线程静态属性"; var taskList = new List<Task>(); for (int i = 0; i < 10; i++)
{
var n = i;
var task = new Task(() =>
{
Console.WriteLine(
$"thread={Thread.CurrentThread.ManagedThreadId} 静态属性={Foo.StaticProperty} 线程静态属性={Foo.ThreadStaticProperty} 次数={n}"); Foo.StaticProperty = n.ToString();
Foo.ThreadStaticProperty = n.ToString();
}); task.Start();
taskList.Add(task);
} Task.WaitAll(taskList.ToArray());
}
我添加了上面的代码用于多个线程输出值同时修改值,在运行的时候可以看到,对于线程静态属性的输出都是空,即使我在代码添加了初始值。因为线程静态属性不支持给初始值,另外在不同的线程修改的线程静态属性是不会影响其他线程
上面代码的输出如下,可能小伙伴运行的输出和我不相同
thread=9 静态属性=普通静态属性 线程静态属性= 次数=4
thread=10 静态属性=普通静态属性 线程静态属性= 次数=3
thread=4 静态属性=普通静态属性 线程静态属性= 次数=1
thread=11 静态属性=普通静态属性 线程静态属性= 次数=7
thread=5 静态属性=普通静态属性 线程静态属性= 次数=0
thread=6 静态属性=普通静态属性 线程静态属性= 次数=2
thread=7 静态属性=普通静态属性 线程静态属性= 次数=5
thread=8 静态属性=普通静态属性 线程静态属性= 次数=6
thread=10 静态属性=3 线程静态属性=3 次数=9
thread=9 静态属性=3 线程静态属性=4 次数=8
从上面代码可以知道如果想要多个线程之间的静态字段或属性不相互影响,可以通过 ThreadStaticAttribute 如输出的最后两行,可以看到普通静态属性是在所有线程使用相同实例,于是输出的静态属性的值相同。但是线程静态属性是每个线程不相同的,在线程 10 的次数是 3 修改的属性值也就是 3 最后输出的就是 3 同时在线程 9 里面的线程静态属性和上次线程修改的相同
本文用到的类放在github 欢迎小伙伴访问
ThreadStatic静态字段在每个线程里的唯一性 - 王树伦的博客 - CSDN博客
C# [ThreadStatic] 标记静态字段对多线程执行的影响 - Ryan_zheng - 博客园
ThreadStatic特性标记静态字段对多线程执行的影响 - b0b0 - 博客园
2019-8-31-dotnet-线程静态字段的更多相关文章
- dotnet 线程静态字段
在 dotnet 程序提供了一个好用的特性,可以让字段作为线程的静态字段,也就是在相同线程的所有代码访问的静态字段是相同对象,但不同线程访问的时候是不同的 在 .NET 程序可以使用 ThreadSt ...
- 深入理解 静态类和静态字段(C# 基础)
序言 以前,总是被提醒,在编程过程中尽量少用静态变量,数据丢失什么的,今天有空,禁不住对静态变量的强烈好奇,跟我一起了解下静态家族的内幕吧. 静态类 定义 静态类与非静态类的重要区别在于静态类不能实例 ...
- python的类和对象(类的静态字段)
转自:http://www.cnblogs.com/Eva-J/p/5044411.html 什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是 ...
- (C# 基础) 静态字段,静态类,静态方法。
静态字段被类的所有实例所共享,即此类的所有实例都访问同一内存地址. 所以该内存位置的值变更的话,这种变更对所有的实例都可见. class MyClass { ; ; public void SetVa ...
- C# [ThreadStatic] 标记静态字段对多线程执行的影响
类的静态字段在类的实例中是共享的.多个线程修改实例字段的值在对其它线程来说是可见的,这也是clr默认的行为.对静态字段添加ThreadStaticAttribute标记可以改变这种默认的行为. Thr ...
- Python之路【番外篇】回顾&类的静态字段
回顾 回顾:字符串.列表.字典的修改关于内存的情况 一.字符串 str1 = 'luotianshuai' str2 = str1 print id(str1) print id(str2) prin ...
- python的类和对象——番外篇(类的静态字段)
什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首 ...
- Spring MVC 属性文件读取注入到静态字段
目录(?)[-] servlet-contextxml configproperties 示例属性 ConfigInfo 对应的配置bean 使用 在项目中,有些参数需要配置到属性文件xxx.pr ...
- C# 之 静态字段初始化
当一个字段声明中含有 static 修饰符时,由该声明引入的字段为静态字段(静态变量).当不存在 static 修饰符时,由该声明引入的字段为实例字段(实例变量). 静态字段不 ...
- C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性
http://www.cnblogs.com/bluestorm/p/3432190.html 问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 下面代码出错的原因,在类中定义的字段为什么不 ...
随机推荐
- 基础教材系列:Linux原理《趣谈linux》极客时间笔记
1.电脑一通电,先运行主板上ROM(只读存储器)里写死的程序BIOS,BIOS去找要运行什么操作系统,运行操作系统的第一段代码,创建0号进程,它是这次开机所有进程的爹, 2.然后操作系统代码里先初始化 ...
- 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第6章
本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录
- LOTO示波器_从零开始手把手测电源开环增益/电源环路频响曲线/PSM
我们之前有篇文章从理论到实践演示了如何测量电源环路的开环增益曲线,不过偏重于理论和原理,没有很多细节的展现,所以这片文章从另外的角度,从零基础开始,手把手一步一步演示如果进行实操测试. 之前的那篇文章 ...
- Unable to load library ‘xxx‘: 找不到指定的模块。找不到指定的模块。 Can‘t obtain InputStream for win32-x86-64/xxx.dll
我使用的是 <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</a ...
- JDBC复习:创建MySQL数据表
1 try { 2 conn=JDBCUtil.getConnection(); 3 preparedStatement = conn.prepareStatement(DROP_TABLE_1); ...
- 02 jQuery选择器
02 jQuery选择器 jQuery的逻辑和css选择器的逻辑是一样的. // 语法: $(选择器) 可以使用jQuery选择器快速的对页面结构进行操作. 案例: <!DOCTYPE html ...
- #交互#CF1370F2 The Hidden Pair (Hard Version)
题目 分析 考虑询问所有点可以知道两个标记点路径上的一个点, 以该点为根建树,可以二分出离该点较远的一个标记点, 再用这个标记点一次询问推出另一个,最多11次询问 代码 #include <cs ...
- C# 关于e.Handled 的说明
e.Handled = false; KeyPressEventArgs.Handled 属性bai获取或设置一个值duzhi,该值指示是否dao处理zhuan过 KeyPress 事件.属性值类型: ...
- 上新啦KIT
HMS Core上新啦!分析服务区服分析全新上线:机器学习服务OCR新增手写识别服务:3D建模续扫能力更新:视频编辑服务支持自定义上传素材--更多#HMS Core#能力可点击网页链接了解. 了解更多 ...
- java excel关联导入数据格式为一对多
java excel关联导入数据格式为一对多 java 表格读取时一行一行的读取 将每行数据放入list 根据 list.stream().filter(m->m.getCode().equa ...