一道关于性能方面的难题
直接进入主题:我有一个单例的类,在这个类里面,保存了很多以map或hashmap存放的超重资源。该单例类被其它线程访问,获取数据。目前的做法是这样的:
for (i = 0; i < 20; i++)
{
构造一个超重资源的临时变量;
加读锁
查找单例类,根据key查找value,把value整个拷贝给临时变量;
解读锁;
外面直接使用临时变量做其它操作;
}
上述流程已经实现了大部分的业务,现在从profile工具的结果来看,"把value整个拷贝给临时变量"占了大部分的性能,导致上述流程性能低下。必须找到一个简单而有效的方法,大面积改造这些现有代码。
另外说明的是,之所以用临时变量,并发是第一要素,第二要素是解锁之后的操作也是繁重的,放入锁内得不偿失。如果不复制到临时变量,比如直接从临界区传出指针,则面临着单例类在更新或删除资源时,有可能出现临界区外的指针失效而死机。