2019-11-7-C#-dotnet-线程不安全的弱引用缓存
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
C# dotnet 线程不安全的弱引用缓存
|
lindexi
|
2019-11-7 9:45:5 +0800
|
2019-11-06 16:58:11 +0800
|
dotnet C#
|
很多逻辑都会使用内存做缓存,这样可以提高运行效率。但是有一些逻辑很少会执行,但是如果有执行就是频繁调用。如我写了文本编辑器,在我打开文件的逻辑,将会不断调用正则判断逻辑,而平时编辑很少会调用。如果将这部分的正则逻辑缓存了,那么可以提升打开文件速度,但是在打开文件之后这部分就成为内存垃圾了。本文给大家一个弱引用缓存,也就是在频繁使用时从内存获取,在不使用时会被回收,这样可以提升性能也能减少内存使用
因为作为缓存,如果需要考虑线程安全,那么这部分的逻辑就复杂了。在不考虑线程安全下,开发一个弱引用缓存还是很简单
首先是创建一个字典,这个字典包含弱引用,这样在获取之前可以先从字典获取
private readonly Dictionary<object, WeakReference<object>> _cacheList =
new Dictionary<object, WeakReference<object>>();
在用户获取之前,需要知道,可能内存回收了。所以使用方法是获取或创建,也就是这个方法不能保证只有第一次获取时才创建,而是看内存回收
public T GetOrCreate<T>(object key, Func<T> createFunc)
如果此时可以从内存获取,那么直接返回
if (_cacheList.TryGetValue(key, out var weakReference))
{
if (weakReference.TryGetTarget(out var value))
{
return (T) value;
}
}
如果不能从内存获取,就需要调用方法创建
var t = createFunc();
weakReference = new WeakReference<object>(t);
_cacheList[key] = weakReference;
return t;
所以获取方法如下
/// <summary>
/// 从缓存获取或在没有获取到创建
/// </summary>
public T GetOrCreate<T>(object key, Func<T> createFunc)
{
if (_cacheList.TryGetValue(key, out var weakReference))
{
if (weakReference.TryGetTarget(out var value))
{
return (T) value;
}
} var t = createFunc();
weakReference = new WeakReference<object>(t);
_cacheList[key] = weakReference;
return t;
}
因为每次给一个 key 也不好用,有一些对象只需要一个类只有存在一个,可以使用类型作为 key 可以再写另一个方法
/// <summary>
/// 从缓存获取或在没有获取到创建
/// </summary>
public T GetOrCreate<T>(Func<T> createFunc)
{
var type = typeof(T);
return GetOrCreate(type, createFunc);
}
这个线程不安全的弱引用缓存所有代码很少,可以直接复制在项目使用
/// <summary>
/// 弱引用缓存
/// </summary>
public class WeakReferenceCache
{
/// <summary>
/// 从缓存获取或在没有获取到创建
/// </summary>
public T GetOrCreate<T>(object key, Func<T> createFunc)
{
if (_cacheList.TryGetValue(key, out var weakReference))
{
if (weakReference.TryGetTarget(out var value))
{
return (T) value;
}
} var t = createFunc();
weakReference = new WeakReference<object>(t);
_cacheList[key] = weakReference;
return t;
} /// <summary>
/// 从缓存获取或在没有获取到创建
/// </summary>
public T GetOrCreate<T>(Func<T> createFunc)
{
var type = typeof(T);
return GetOrCreate(type, createFunc);
} private readonly Dictionary<object, WeakReference<object>> _cacheList =
new Dictionary<object, WeakReference<object>>();
}
此方法是线程不安全的,请不要在多线程下使用此方法,可以通过 线程静态字段 让一个线程有一个实例
本文代码放在 github 欢迎小伙伴访问
2019-11-7-C#-dotnet-线程不安全的弱引用缓存的更多相关文章
- 《Android开发艺术探索》读书笔记 (11) 第11章 Android的线程和线程池
第11章 Android的线程和线程池 11.1 主线程和子线程 (1)在Java中默认情况下一个进程只有一个线程,也就是主线程,其他线程都是子线程,也叫工作线程.Android中的主线程主要处理和界 ...
- 《Android开发艺术探索》第11章 Android的线程和线程池
第11章 Android的线程和线程池 11.1 主线程和子线程 (1)在Java中默认情况下一个进程只有一个线程,也就是主线程,其他线程都是子线程,也叫工作线程.Android中的主线程主要处理和界 ...
- EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)
传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...
- [New!!!]欢迎大佬光临本蒟蒻的博客(2019.11.27更新)
更新于2019.12.22 本蒟蒻在博客园安家啦!!! 本蒟蒻的博客园主页 为更好管理博客,本蒟蒻从今天开始,正式转入博客园. 因为一些原因,我的CSDN博客将彻底不会使用!!!(带来不便,敬请谅解) ...
- 2019.11.9 csp-s 考前模拟
2019.11.9 csp-s 考前模拟 是自闭少女lz /lb(泪奔 T1 我可能(呸,一定是唯一一个把这个题写炸了的人 题外话: 我可能是一个面向数据编程选手 作为一个唯一一个写炸T1的人,成功通 ...
- C++11 左值、右值、右值引用详解
C++11 左值.右值.右值引用详解 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值. 在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没 ...
- ThreadLocal 定义,以及是否可能引起的内存泄露(threadlocalMap的Key是弱引用,用线程池有可能泄露)
ThreadLocal 也可以跟踪一个请求,从接收请求,处理请求,到返回请求,只要线程不销毁,就可以在线程的任何地方,调用这个参数,这是百度二面的题目,参考: Threadlocal 传递参数(百度二 ...
- Volatile如何保证线程可见性之总线锁、缓存一致性协议
基础知识回顾 下图给出了假想机的基本设计.中央处理单元(CPU)是进行算术和逻辑操作的部件,包含了有限数量的存储位置--寄存器(register),一个高频时钟.一个控制单元和一个算术逻辑单元. 时钟 ...
- dotnet 线程静态字段
在 dotnet 程序提供了一个好用的特性,可以让字段作为线程的静态字段,也就是在相同线程的所有代码访问的静态字段是相同对象,但不同线程访问的时候是不同的 在 .NET 程序可以使用 ThreadSt ...
- 使用C++11安全的在线程中控制UI
本篇文章由:http://www.sollyu.com/using-the-c11-secure-online-process-control-ui/ 说明 首先这里使用的是 Visual Studi ...
随机推荐
- 38 ubuntu/windows双系统安装
0 引言 (1)针对bios 和 uefi引导,安装方式略有不同. (2)针对nvidia显卡,在安装时需要特殊设置. 1 EasyBCD安装方式介绍-适用于bios引导方式 参考百度经验贴安装即可, ...
- due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.jaxen.util.AncestorAxisIt
七月 31, 2019 4:39:01 下午 org.apache.catalina.startup.VersionLoggerListener log信息: Server version: Apac ...
- PAT_A1020#Tree Traversals
Source: PAT A1020 Tree Traversals (25 分) Description: Suppose that all the keys in a binary tree are ...
- [kuangbin带你飞]专题一 简单搜索 - M - 非常可乐
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...
- 20140319 const sizeof define 编译时分配内存
1.面试宝典预处理,const,sizeof Define作用定义函数: //用一个宏定义FIND求一个结构体struc里某个变量相对于struc的偏移量,如FIND(student,a)//等于0 ...
- Python3批量修改指定目录下面的图片/文件名
需求: 从网上下载的N张.png图片保存到image目录中,将下载下来的图片全部重命名test1.png/test2.png... 实现代码: 目录结构: config-->setting.py ...
- RDD运行原理
- 【学术篇】SDOI2008 沙拉公主的困惑
传送门! 题目在这里... 题目大意? 难道不是说的很清楚了么OvO 求n!中与m!互质的数的个数.. 题目分析. 显然的数论... 所以就是化式子呗.. 一个很显然的性质就是如果\(gcd(a,b) ...
- js 阻止事件
event.stopPropagation();//阻止事件冒泡 ,可阻止父类事件的发生 event.preventDefault();//阻止默认行为 如A标签
- 使用FastJson转化Json格式
1.下载Jar包 http://repo1.maven.org/maven2/com/alibaba/fastjson/ 2.将jar包导入工程 3.示例 package nc.testFastJso ...