C# 中的一个特性(Attribute)[ThreadStatic]

[ThreadStatic] 是 C# 中的一个特性(Attribute),用于指示静态字段的值在每个线程中是唯一的。这意味着每个访问该字段的线程都有自己独立的副本,从而避免了线程之间的干扰。

关键点:

  • 线程特定存储 :每个线程都有自己独立的 [ThreadStatic] 字段实例。

  • 静态字段要求:该特性只能应用于静态字段。

  • 初始化 :在每个线程中,字段会被初始化为默认值(如 null0false),除非显式设置。

示例:

cs 复制代码
using System;
using System.Threading;

class Program
{
    [ThreadStatic]
    private static int _threadLocalValue;

    static void Main()
    {
        _threadLocalValue = 10;

        Thread thread = new Thread(() =>
        {
            _threadLocalValue = 20;
            Console.WriteLine($"线程 ID: {Thread.CurrentThread.ManagedThreadId}, 值: {_threadLocalValue}");
        });

        thread.Start();
        thread.Join();

        Console.WriteLine($"线程 ID: {Thread.CurrentThread.ManagedThreadId}, 值: {_threadLocalValue}");
    }
}

输出:

cs 复制代码
线程 ID: 2, 值: 20
线程 ID: 1, 值: 10

解释:

主线程将 _threadLocalValue 设置为 10。

新线程将自己的 _threadLocalValue 副本设置为 20。

每个线程都维护自己的值,展示了线程隔离的特性。

使用场景:

线程特定数据:适用于存储不应在线程间共享的数据,例如用户会话或事务上下文。

性能优化:减少多线程应用中对锁或同步机制的需求。

局限性:

无继承性:子线程不会从父线程继承该字段的值。

复杂性:由于线程特定的行为,可能会增加调试和维护的复杂性。

替代方案:

ThreadLocal<T>:提供类似功能,并支持更多特性,如延迟初始化和对非静态字段的更好支持。

使用 ThreadLocal<T> 的示例:

cs 复制代码
using System;
using System.Threading;

class Program
{
    private static ThreadLocal<int> _threadLocalValue = new ThreadLocal<int>(() => 10);

    static void Main()
    {
        Thread thread = new Thread(() =>
        {
            _threadLocalValue.Value = 20;
            Console.WriteLine($"线程 ID: {Thread.CurrentThread.ManagedThreadId}, 值: {_threadLocalValue.Value}");
        });

        thread.Start();
        thread.Join();

        Console.WriteLine($"线程 ID: {Thread.CurrentThread.ManagedThreadId}, 值: {_threadLocalValue.Value}");
    }
}

输出:

cs 复制代码
线程 ID: 2, 值: 20
线程 ID: 1, 值: 10

总结:

ThreadStatic 是实现线程本地存储的一种简单方式,但在更复杂的场景中,ThreadLocal<T> 通常是更好的选择。

相关推荐
枳实-叶1 小时前
【Linux驱动开发】第23天:spi_driver 的 probe / remove 函数实现规范
linux·驱动开发·c#
长明1 小时前
C#项目组织与概念梳理
后端·c#
迷路爸爸1802 小时前
Python collections 入门+实战
windows·python·c#·collections·dict
csdn_aspnet2 小时前
C# 截取或匹配字符串内包含指定字符的一些方法
c#·字符串·分割·string·匹配·截取
Rotion_深2 小时前
C# 值类型与引用类型 详解
开发语言·jvm·c#
影寂ldy13 小时前
C# try-catch 异常处理全套笔记
服务器·数据库·c#
TeamDev14 小时前
JxBrowser 9.3.0 版本发布啦!
java·后端·c#·混合应用·jxbrowser·浏览器控件·异步媒体设备
梦帮科技15 小时前
UE5 GAS 实战:用 Gameplay Ability System 搭建「赛博修真」境界与技能体系
c++·人工智能·python·ue5·c#
北域码匠19 小时前
RIPEMD-128哈希算法深度解析
c#·密码学·哈希算法·加密算法·消息摘要·ripemd-128·原生实现
csdn_aspnet21 小时前
C# 截取或匹配字符串内包含指定字符
c#·字符串·正则·string·匹配·截取