c# – 使用静态MemcachedClient的问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用静态MemcachedClient的问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2413字,纯文字阅读大概需要4分钟。
内容图文
![c# – 使用静态MemcachedClient的问题](/upload/InfoBanner/zyjiaocheng/781/19f3b455cf7143fabbc8cf703adfdbff.jpg)
我正在使用Memcached来存储数据以便快速访问.我已经读过创建MemcachedClient的成本很高,并且将MemcachedClient用作静态(参见:link)
所以我为我的客户使用Singleton模式:
public class CommonObjectsCache
{
private static CommonObjectsCache _cache;
private static MemcachedClient _client;
public static MemcachedClient Client
{
get
{
if (_client == null)
_client = new MemcachedClient();
return _client;
}
private set
{
_client = value;
}
}
private CommonObjectsCache()
{
_client = new MemcachedClient();
}
public static CommonObjectsCache Cache
{
get
{
if (_cache == null)
_cache = new CommonObjectsCache();
return _cache;
}
}
}
在我的DAL中,我使用它们如下:
public static List<Item1> AllItem1s
{
get
{
if (CommonObjectsCache.Client.Get<List<Item1>>("AllItem1s") == null)
RefreshItem1Cache();
return CommonObjectsCache.Client.Get<List<Item1>>("AllItem1s");
}
private set
{
CommonObjectsCache.Client.Store(StoreMode.Set, "AllItem1s", value);
}
}
public static List<Item2> AllItem2s
{
get { // Same as above }
private set { // Same as above }
}
public static List<Item3> AllItem3s
{
get { // Same as above }
private set { // Same as above }
}
public static List<Item4> AllItem4s
{
get { // Same as above }
private set { // Same as above }
}
并填写为:
public static void RefreshItem1Cache()
{
List<Item1> items = (from i ctx.Item1
select i).ToList();
AllItem1s = items;
}
在我的DAL代码中,我有一个方法,如:
public static MyModel GetMyModel(int? id)
{
// I use AllItem1s here.
}
当我运行代码时,它有时会说AllItem1s.Count == 0,但是当我在AllItem1s中放置断点并诊断该值时,我发现它已被填充.所以,我更新了代码如下,以检查我是否做错了:
public static MyModel GetMyModel(int? id)
{
if (AllItem1s == null || AllItem1s.Count == 0 || AllItem2s == null || AllItem2s.Count == 0 || AllItem3s == null || AllItem3s.Count == 0 || AllItem4s == null || AllItem4s.Count == 0)
{
string msg = "Error!!!!!";
}
// I use AllItem1s here.
}
令人惊讶的是,代码落到了字符串msg =“Error !!!!!”;块!!!
但是当我在if块中放置一个断点并观察每个集合的Count属性时,我发现它有数字.
所以我得出结论,在获取AllItemXs属性时存在竞争条件.当它检查条件时,其中至少有一个没有被正确设置(这没有意义,因为它们在同一个线程上,并且属性的getter不能返回空集合).
任何人都可以解释为什么会发生这种情况以及如何克服这个问题?
解决方法:
您的单例实现不是线程安全的.
想象一下,两个(或更多)线程同时命中空检查:两个(所有)线程将初始化它们自己的CommonObjectsCache实例.
您可以使用lock语句对实例进行空检查和初始化,也可以使用双重检查锁定模式.
只需谷歌在C#中实现线程安全的单例实现.
内容总结
以上是互联网集市为您收集整理的c# – 使用静态MemcachedClient的问题全部内容,希望文章能够帮你解决c# – 使用静态MemcachedClient的问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。