疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

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


 

   

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

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

  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;

  }

  }