代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Threading;

namespace Rocky
{
public class SyncDictionary : IDictionary
{
#region wrap
private IDictionary wrapDictionary;

public SyncDictionary()
: this(new HybridDictionary())
{

}
public SyncDictionary(IDictionary dictionary)
{
if (dictionary == null)
{
throw new ArgumentNullException("dictionary");
}
wrapDictionary = dictionary;
}
#endregion

#region IDictionary 成员
public void Add(object key, object value)
{
if (!wrapDictionary.Contains(key))
{
lock (wrapDictionary.SyncRoot)
{
if (!wrapDictionary.Contains(key))
{
wrapDictionary.Add(key, value);
}
}
}
}

public void Clear()
{
if (wrapDictionary.Count > 0)
{
lock (wrapDictionary.SyncRoot)
{
if (wrapDictionary.Count > 0)
{
wrapDictionary.Clear();
}
}
}
}

public bool Contains(object key)
{
return wrapDictionary.Contains(key);
}

public IDictionaryEnumerator GetEnumerator()
{
return wrapDictionary.GetEnumerator();
}

bool IDictionary.IsFixedSize
{
get { return wrapDictionary.IsFixedSize; }
}

bool IDictionary.IsReadOnly
{
get { return wrapDictionary.IsReadOnly; }
}

public ICollection Keys
{
get
{
lock (wrapDictionary.SyncRoot)
{
return wrapDictionary.Keys;
}
}
}

public void Remove(object key)
{
if (wrapDictionary.Contains(key))
{
lock (wrapDictionary.SyncRoot)
{
if (wrapDictionary.Contains(key))
{
wrapDictionary.Remove(key);
}
}
}
}

public ICollection Values
{
get
{
lock (wrapDictionary.SyncRoot)
{
return wrapDictionary.Values;
}
}
}

public object this[object key]
{
set
{
lock (wrapDictionary.SyncRoot)
{
wrapDictionary[key] = value;
}
}
get
{
return wrapDictionary[key];
}
}
#endregion

#region ICollection 成员
public void CopyTo(Array array, int index)
{
lock (wrapDictionary.SyncRoot)
{
wrapDictionary.CopyTo(array, index);
}
}

public int Count
{
get { return wrapDictionary.Count; }
}

bool ICollection.IsSynchronized
{
get { return true; }
}

object ICollection.SyncRoot
{
get { return wrapDictionary.SyncRoot; }
}
#endregion

#region IEnumerable 成员
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
#endregion
}

public class SyncDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
#region wrap
private object syncRoot;
private IDictionary<TKey, TValue> wrapDictionary;

private object SyncRoot
{
get
{
if (syncRoot == null)
{
Interlocked.CompareExchange(ref syncRoot, new object(), null);
}
return syncRoot;
}
}

public SyncDictionary()
: this(new Dictionary<TKey, TValue>())
{

}
public SyncDictionary(IDictionary<TKey, TValue> dictionary)
{
if (dictionary == null)
{
throw new ArgumentNullException("dictionary");
}
wrapDictionary = dictionary;
}
#endregion

#region IDictionary<TKey,TValue> 成员
public void Add(TKey key, TValue value)
{
if (!wrapDictionary.ContainsKey(key))
{
lock (this.SyncRoot)
{
if (!wrapDictionary.ContainsKey(key))
{
wrapDictionary.Add(key, value);
}
}
}
}

public bool ContainsKey(TKey key)
{
return wrapDictionary.ContainsKey(key);
}

public ICollection<TKey> Keys
{
get
{
lock (this.SyncRoot)
{
return wrapDictionary.Keys;
}
}
}

public bool Remove(TKey key)
{
if (wrapDictionary.ContainsKey(key))
{
lock (this.SyncRoot)
{
if (wrapDictionary.ContainsKey(key))
{
return wrapDictionary.Remove(key);
}
}
}
return false;
}

public bool TryGetValue(TKey key, out TValue value)
{
lock (this.SyncRoot)
{
return wrapDictionary.TryGetValue(key, out value);
}
}

public ICollection<TValue> Values
{
get
{
lock (this.SyncRoot)
{
return wrapDictionary.Values;
}
}
}

public TValue this[TKey key]
{
set
{
lock (this.SyncRoot)
{
wrapDictionary[key] = value;
}
}
get
{
TValue value;
wrapDictionary.TryGetValue(key, out value);
return value;
}
}
#endregion

#region ICollection<KeyValuePair<TKey,TValue>> 成员
void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item)
{
lock (this.SyncRoot)
{
((ICollection<KeyValuePair<TKey, TValue>>)wrapDictionary).Add(item);
}
}

public void Clear()
{
if (wrapDictionary.Count > 0)
{
lock (this.SyncRoot)
{
if (wrapDictionary.Count > 0)
{
wrapDictionary.Clear();
}
}
}
}

bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item)
{
return ((ICollection<KeyValuePair<TKey, TValue>>)wrapDictionary).Contains(item);
}

public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{
lock (this.SyncRoot)
{
((ICollection<KeyValuePair<TKey, TValue>>)wrapDictionary).CopyTo(array, arrayIndex);
}
}

public int Count
{
get { return wrapDictionary.Count; }
}

bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly
{
get { return false; }
}

bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item)
{
lock (this.SyncRoot)
{
return ((ICollection<KeyValuePair<TKey, TValue>>)wrapDictionary).Remove(item);
}
}
#endregion

#region IEnumerable<KeyValuePair<TKey,TValue>> 成员
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
return ((ICollection<KeyValuePair<TKey, TValue>>)wrapDictionary).GetEnumerator();
}
#endregion

#region IEnumerable 成员
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
#endregion
}
}

转载于:https://www.cnblogs.com/Googler/archive/2010/06/11/1756447.html

C# SyncDictionary类相关推荐

  1. 厚积薄发,丰富的公用类库积累,助你高效进行系统开发(10)---各种线程同步的集合类...

    俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力. 本篇的公用类库的介绍主题是程序开发中多线程操作环境中,常用到的线程安全的各类同 ...

  2. 自己搜集编写的Delphi 通用函数

    { ********************************************************************** } { Currency Common Functio ...

  3. 继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错? springboot 两种方式稳定解决跨域问题

    继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错???springboot 两种方式稳定解决跨域问题! 之前我写了一篇文章,来解决CORS报错 ...

  4. MybatisPlus忽略实体类中的非数据库字段、JPA忽略实体类中的非数据库字段、HeHibernate忽略实体类中的非数据库字段

    mybatis plus忽略映射字段时可以在实体类属性上使用以下注解: @TableField(exist = false):表示该属性不为数据库表字段,但又是必须使用的. @TableField(e ...

  5. IDEA中根据数据库自动生成实体类,并自定义所生成的实体类中的注解 @Table @Id @...

    使用IDEA项目添加Hibernate扩展,生成实体类并配置实体类中的注解 一.使用Hibernate自动生成实体类 1.在项目上右键,选择Add Framework Support找到 Hibern ...

  6. IDEA自动生成类注解,IDEA作者信息自动生成,IDEA类信息自动生成

    在新建类文件的时候自动生成注解,诸如我们常见的那些 作者,创建时间,TODO 等等 将以下格式的代码放在Settings -> File and Code Templates -> Inc ...

  7. javabean实体类与实体类之间的快速转换

    一.Dozer是什么? dozer是一个能把实体和实体之间进行转换的工具.只要建立好映射关系.就像是ORM的数据库和实体映射一样. 使用方法示例如下: // article(PO) -> art ...

  8. 利用dom4j将实体类转换为对应的xml报文

    利用dom4j生成xml报文 目标格式: <?xml version="1.0" encoding="GBK"?><Packet type=& ...

  9. Idea groovy表生成实体类带注释

    Idea groovy表生成实体类带注释 1.点开datasourse,打开idea带的数据库工具,具体添加数据库连接,这里不描述. 这时点击会生成一个poji 这时生成的pojo中是不带中文注释的, ...

  10. java带参数的方法笔记_具有Java参数的方法的类声明

    类声明可以包含在Java中具有参数的方法.演示此过程的程序如下: 示例class Message { public void messagePrint(String msg) { System.out ...

最新文章

  1. Mozilla 财报:2017年收入增长超过 4000 万美元
  2. kmeans实际应用例子 java_k-means聚类JAVA实例
  3. python应用中调用spark_在python中使用pyspark读写Hive数据操作
  4. 启明云端分享|ESP32-C3 IO口控制灯的应用及串口通信示例
  5. Java Micro-Benchmarking:如何编写正确的基准
  6. Java 习题(面向对象)
  7. 关于管理,这5大误区你越早知道越好
  8. hexbin_Power BI Desktop中的Hexbin散点图
  9. 力扣--125验证回文串/680验证回文字符串II
  10. iOS开发,更改状态栏(StatusBar)文字颜色为白色
  11. Revit (6) - Teigha - LayerTable
  12. 从国产手机自强复盘小米十年
  13. 逍遥魔兽手动打开mysql_逍遥魔兽gm命令使用
  14. Android隐藏app应用图标(隐式启动)
  15. 程序开发类本科论文结构【2022年修改】
  16. 【总结】二手书网站开发总结(业余时间开发)
  17. 2021年腾讯云618活动最新优惠攻略
  18. ios各种手势,很有意思
  19. qt 通过ODBC链接MYSQL
  20. 面向中小企业的SpringBoot管理系统,拿来学习真香

热门文章

  1. (转)C#封装CTP
  2. 支付那些事儿III---一个BD汪眼中的产品II
  3. 【干货】高盛合伙人制度和激励机制!
  4. 【优化覆盖】基于matlab粒子群算法求解传感器覆盖优化问题【含Matlab源码 598期】
  5. 【手写数字识别】基于matlab GUI BP神经网络手写数字识别系统【含Matlab源码 1639期】
  6. 【目标跟踪】基于matlab光流法运动视频跟踪【含Matlab源码 1357期】
  7. 【指纹识别】基于matlab GUI指纹识别【含Matlab源码 1353期】
  8. 【图像评价】基于matlab无参考图像质量评价NIQE【含Matlab源码 681期】
  9. 【CPI指数预测】基于matlab BP神经网络CPI指数预测【含Matlab源码 662期】
  10. icons在java显示出来_java – 制作jfilechooser显示图像缩略图