随笔 - 46  文章 - 0  评论 - 136  阅读 - 11万

线程静态在对象缓存中的妙用

    线程静态标记静态字段的值对于每个线程都是唯一的。简单来说,是只应用在静态字段上,而且对于每一个线程都是独立存储的。

    那么,结合对象缓存来说,需求如下:

    1、一些工具类,需要占用一定资源,但又不希望太频繁的创建该工具类。

    2、需要适应多线程的情况

一个例子就是StringBuilder类,StringBuilder类内部实现使用了char[]来存储字符,我们需要使用StringBuilder来创建字符串,而且希望不太频繁的创建它,避免内存压力。

下面,就是.NET Framework 4.5.1 中对StringBuilderCache的实现:

复制代码
internal static class StringBuilderCache{

    private const int MAX_BUILDER_SIZE = 360;

    [ThreadStatic]
    private static StringBuilder CachedInstance;

    public static StringBuilder Acquire(int capacity = StringBuilder.DefaultCapacity){
        if(capacity <= MAX_BUILDER_SIZE){
            StringBuilder sb = StringBuilderCache.CachedInstance;
            if (sb != null){
                if(capacity <= sb.Capacity){
                    StringBuilderCache.CachedInstance = null;
                    sb.Clear();
                    return sb;
                }
            }
        }
        return new StringBuilder(capacity);
    }

    public static void Release(StringBuilder sb){
        if (sb.Capacity <= MAX_BUILDER_SIZE){
            StringBuilderCache.CachedInstance = sb;
        }
    }

    public static string GetStringAndRelease(StringBuilder sb){
        string result = sb.ToString();
        Release(sb);
        return result;
    }
}
复制代码

带完整注释的版本可以参考:http://www.projky.com/dotnet/4.5.1/System/Text/StringBuilderCache.cs.html

采用StringBuidlerCache类的例子是String.Join方法,可以参考:http://www.projky.com/dotnet/4.5.1/System/String.cs.html

不得不赞一下,这样的设计非常巧妙。.NET 中程序的执行都在线程中,每个线程都有自己单独的缓存,再也不用担心同步、加锁的问题,而且对于缓存的对象设置了大小限制。

再总结下它的原理:通过线程静态赋予了静态字段在多线程中独立存储的能力,再通过操作该静态字段来存储缓存对象。

posted on   ProJKY  阅读(2421)  评论(5编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示