• (转载)线程静态在对象缓存中的妙用


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

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

        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 中程序的执行都在线程中,每个线程都有自己单独的缓存,再也不用担心同步、加锁的问题,而且对于缓存的对象设置了大小限制。

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

    版权归博客园和作者共有。.NET类库源码参考,邮箱 projky at 126.com 转载请注明出处。
  • 相关阅读:
    搭建hexo个人博客
    Scanner类使用close()方法问题
    记录一次Ubuntu基础配置和美化
    Linux更换默认Shell
    python-成员修饰符
    ysoserial项目之URLDNS利用分析
    Apereo Cas4.x 反序列化漏洞复现之复现分析与利用
    JAVA反序列化漏洞之调试环境搭建(含ysoserial项目)
    虚拟机window7忘记密码,如何重置?
    多种类型SQL注入
  • 原文地址:https://www.cnblogs.com/gracian/p/3654083.html
Copyright © 2020-2023  润新知