.NET并行计算和并发4-Thread-Relative Static Fields and Data Slots
Thread Local Storage: Thread-Relative Static Fields and Data Slots
文章摘自msdn library官方文档
可以使用托管线程本地存储区 (TLS) 存储某一线程和应用程序域所独有的数据。 .NET Framework 提供了两种使用托管 TLS 的方式:线程相关的静态字段和数据槽。
如果您可以在编译时预料到您的确切需要,请使用线程相关的静态字段(在 Visual Basic 中为线程相关的 Shared 字段)。 线程相关的静态字段可提供最佳性能。 它们还具备编译时类型检查的优点。
如果只能在运行时发现您的实际需要,请使用数据槽。 数据槽比线程相关的静态字段慢一些且更加难于使用,并且数据存储为 Object 类型,因此必须将其强制转换为正确的类型才能使用。
在非托管 C++ 中,可以使用 TlsAlloc 来动态分配槽,使用 __declspec(thread) 来声明变量应在线程相关的存储区中进行分配。 线程相关的静态字段和数据槽提供了此行为的托管版本。
在 .NET Framework 4中,可以使用 System.Threading.ThreadLocal<T> 类创建线程本地对象,在第一次使用该对象时它将惰式初始化。 有关详细信息,请参阅延迟初始化。
无论是使用线程相关的静态字段还是使用数据槽,托管 TLS 中的数据都是线程和应用程序域组合所独有的。
在应用程序域内部,一个线程不能修改另一个线程中的数据,即使这两个线程使用同一个字段或槽时也不能。
当线程从多个应用程序域中访问同一个字段或槽时,会在每个应用程序域中维护一个单独的值。
例如,如果某个线程设置线程相关的静态字段的值,接着它进入另一个应用程序域,然后检索该字段的值,则在第二个应用程序域中检索的值将不同于第一个应用程序域中的值。 在第二个应用程序域中为该字段设置一个新值不会影响第一个应用程序域中该字段的值。
同样,当某个线程获取两个不同应用程序域中的同一命名数据槽时,第一个应用程序域中的数据将始终与第二个应用程序域中的数据无关。
如果您知道一些数据总是某个线程和应用程序域组合所独有的,请向该静态字段应用 ThreadStaticAttribute 特性。 与使用任何其他静态字段一样使用该字段。 该字段中的数据是每个使用它的线程所独有的。
线程相关的静态字段的性能优于数据槽,并且具有编译时类型检查的优点。
请注意,任何类构造函数代码都将在访问该字段的第一个上下文中的第一个线程上运行。 在同一应用程序域内的所有其他线程或上下文中,如果字段是引用类型,它们将被初始化为 null(在 Visual Basic 中为 Nothing);如果字段是值类型,它们将被初始化为它们的默认值。 因此,您不应依赖于类构造函数来初始化线程相关的静态字段。 而应避免初始化线程相关的静态字段并假定它们初始化为 null (Nothing) 或它们的默认值。
.NET Framework 提供了线程和应用程序域组合所独有的动态数据槽。 数据槽包括两种类型:命名槽和未命名槽。 两者都是通过使用LocalDataStoreSlot 结构来实现的。
若要创建命名数据槽,请使用 Thread.AllocateNamedDataSlot 或 Thread.GetNamedDataSlot 方法。 若要获取对某个现有命名槽的引用,请将其名称传递给 GetNamedDataSlot 方法。
若要创建未命名数据槽,请使用 Thread.AllocateDataSlot 方法。
对于命名槽和未命名槽,请使用 Thread.SetData 和 Thread.GetData 方法设置和检索槽中的信息。 这些都是静态方法,它们始终作用于当前正在执行它们的线程的数据。
命名槽可能很方便,因为您可以在需要它时通过将其名称传递给 GetNamedDataSlot 方法来检索该槽,而不是维护对未命名槽的引用。 但是,如果另一个组件使用相同的名称来命名其线程相关的存储区,并且有一个线程同时执行来自您的组件和该组件的代码,则这两个组件可能会破坏彼此的数据。(本方案假定这两个组件在同一应用程序域内运行,并且它们并不用于共享相同数据。)
.NET并行计算和并发4-Thread-Relative Static Fields and Data Slots的更多相关文章
- java 并发编程——Thread 源码重新学习
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- Resource annotation is not supported on static fields
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'paramUtil' d ...
- Core Java Volume I — 4.4. Static Fields and Methods
4.4. Static Fields and MethodsIn all sample programs that you have seen, the main method is tagged w ...
- Android JNI 学习(九):Static Fields Api & Static Methods Api
一.Accessing Static Fields(访问静态域) 1. GetStaticFieldID jfieldIDGetStaticFieldID(JNIEnv *env, jclass cl ...
- Java并发基础——Thread
并发编程可以使我们将程序划分为多个分离的,独立运行的任务.通过多线程机制,这些独立任务都将由执行线程来驱动.在使用线程时,CPU将轮流给每个任务分配占用时间,每个任务都觉得自己在占用CPU,但实际上C ...
- 多线程并发 了解 Thread
通过上一篇 多线程并发 (一) 了解 Java 虚拟机 - JVM 了解了java 虚拟机的构成以及对象的创建等.从Java虚拟机栈我们知道每当我们创建一个线程JVM就会给我们的线程分配一个私有的内存 ...
- css中position属性(absolute|relative|static|fixed)概述及应用
position属性的相关定义: static:无特殊定位,对象遵循正常文档流; relative:对象遵循正常文档流; absolute:对象脱离正常文档流 fixed:对象脱离正常文档流 我们先来 ...
- 【转】CSS中position属性( absolute | relative | static | fixed )详解
我们先来看看CSS3 Api中对position属性的相关定义: static:无特殊定位,对象遵循正常文档流.top,right,bottom,left等属性不会被应用. relative:对象遵循 ...
- CSS中position属性( absolute | relative | static | fixed )详解
我们先来看看CSS3 Api中对position属性的相关定义: static:无特殊定位,对象遵循正常文档流.top,right,bottom,left等属性不会被应用. relative:对象遵循 ...
随机推荐
- 用javaScript获取页面元素值
用JavaScript获取页面元素常见的三种方法: getElementById() ...
- 破解网页右键被禁止js
按F12,点击console输入一下内容后按回车 javascript:alert(document.onselectstart = document.oncontextmenu= document. ...
- FJUT3703 这还是一道数论题(二分 + hash + manacher 或者 STL + hash 或者 后缀数组 + hash)题解
Problem Description 最后来个字符串签个到吧,这题其实并不难,所需的算法比较基础,甚至你们最近还上过课. 为了降低难度,免得所有人爆零.这里给几个提示的关键字 :字符串,回文,二分, ...
- 拦截导弹nlogn解法
题目 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国 ...
- 【Entity Framework】Model First Approach
EF中的model first 所谓mf, 就是使用vs提供的edm designer去设计model,然后将设计好的model使用vs在指定的数据库中生成数据库即可. 当你的项目既没有数据库也没有c ...
- 在WPF中调用打开文件对话框
// Create OpenFileDialog Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); ...
- 一键清空Form表单数据
今天在工作项目调试bug当中,遇到这样的需求:页面上的数据太多,一个一个清空太繁琐,所以就采用全部清空的写法: $(':input','#myform').not(':button, :submit, ...
- java IO和NIO区别
面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方 ...
- 省市区三级联选select2.js
<div class="mui-input-row row_then" id='showCityPicker3'> <input id='cityResult3' ...
- Windows to go 慢,更换 user profile 路径
用 wintousb 安装了 windwos 10 到 u盘 之后, 发觉这个windows 贼慢,卡的不行. 想起以前台式机上用[太阳花]SDD,硬盘满了也是这个感觉的. 就知道 C盘的userpr ...