发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
那么,结合对象缓存来说,需求如下:
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./dotnet/4.5.1/System/Text/StringBuilderCache.cs.html
采用StringBuidlerCache类的例子是String.Join方法,可以参考:http://www./dotnet/4.5.1/System/String.cs.html
不得不赞一下,这样的设计非常巧妙。.NET 中程序的执行都在线程中,每个线程都有自己单独的缓存,再也不用担心同步、加锁的问题,而且对于缓存的对象设置了大小限制。
再总结下它的原理:通过线程静态赋予了静态字段在多线程中独立存储的能力,再通过操作该静态字段来存储缓存对象。
来自: 昵称10504424 > 《工作》
0条评论
发表
请遵守用户 评论公约
一文了解 Java 应用程序性能优化指南
一文了解 Java 应用程序性能优化指南。首先定义出可度量的性能指标,然后通过不同的工具来衡量和监控应用程序性能,并找到影响性能的瓶...
Java 性能优化之最佳实践
通过使用不同的负载测试和应用监测工具(APM)解决方案通常用于跟踪与优化 Java应用程序的性能。对应用程序的 API 进行负载测试有助开发...
是String,StringBuffer还是StringBuilder ?
相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE 5.0 里面带来...
【总结】String in Java
4 ldc <String "Hello world"> [17] //将常量池中的字符串常量"Hello world"指向的堆中拘留String对象的地...
NET 性能优化方法总结
我们遇到过一个用Hashtable来缓存对象的例子,每次根据传递的OQL表达式构造出一个ExpressionList对象,再调用QueryCompiler的方法编译得到CompiledQuery对象。放到ViewState中的内容会被序列化/反序列...
Java基础面试题大全 新地图开啦~
注意:虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。内部类有以下...
String和StringBuffer区别
好处:提高了代码的扩展性弊端:父类的引用只能访问父类中有的成员(父类引用无法调用子类中特有的方法)8、wait()和sleep()的区别(1)wait是Object类中的方法,sleep是Thread类中的方法(2)sleep方法没有...
java面试题 --- 基础
java面试题 --- 基础。加载的先后顺序是:父类静态成员变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子...
String、StringBuffer和StringBuilder的区别
String、StringBuffer和StringBuilder的区别String是不可变的,StringBuffer是可变的;StringBuffer是线程安全的,StringBuilder是非线程安全的。因而在大部分情况下字符串的拼接速度为:StringBuilder...
微信扫码,在手机上查看选中内容