| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | using System.Collections.Generic;namespace SharpCifs.Util.Sharpen{    internal class ConcurrentHashMap<T, TU> : AbstractMap<T, TU>, IConcurrentMap<T, TU>	{		private Dictionary<T, TU> _table;		public ConcurrentHashMap ()		{			_table = new Dictionary<T, TU> ();		}		public ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)		{			_table = new Dictionary<T, TU> (initialCapacity);		}		public override void Clear ()		{			lock (_table) {				_table = new Dictionary<T, TU> ();			}		}		public override bool ContainsKey (object name)		{			return _table.ContainsKey ((T)name);		}		public override ICollection<KeyValuePair<T, TU>> EntrySet ()		{			return this;		}		public override TU Get (object key)		{			TU local;			_table.TryGetValue ((T)key, out local);			return local;		}		protected override IEnumerator<KeyValuePair<T, TU>> InternalGetEnumerator ()		{			return _table.GetEnumerator ();		}		public override bool IsEmpty ()		{			return _table.Count == 0;		}		public override TU Put (T key, TU value)		{			lock (_table) {				TU old = Get (key);				Dictionary<T, TU> newTable = new Dictionary<T, TU> (_table);				newTable[key] = value;				_table = newTable;				return old;			}		}		public TU PutIfAbsent (T key, TU value)		{			lock (_table) {				if (!ContainsKey (key)) {					Dictionary<T, TU> newTable = new Dictionary<T, TU> (_table);					newTable[key] = value;					_table = newTable;					return value;				}				return Get (key);			}		}		public override TU Remove (object key)		{			lock (_table) {				TU old = Get ((T)key);				Dictionary<T, TU> newTable = new Dictionary<T, TU> (_table);				newTable.Remove ((T)key);				_table = newTable;				return old;			}		}		public bool Remove (object key, object value)		{			lock (_table) {				if (ContainsKey (key) && value.Equals (Get (key))) {					Dictionary<T, TU> newTable = new Dictionary<T, TU> (_table);					newTable.Remove ((T)key);					_table = newTable;					return true;				}				return false;			}		}		public bool Replace (T key, TU oldValue, TU newValue)		{			lock (_table) {				if (ContainsKey (key) && oldValue.Equals (Get (key))) {					Dictionary<T, TU> newTable = new Dictionary<T, TU> (_table);					newTable[key] = newValue;					_table = newTable;					return true;				}				return false;			}		}		public override IEnumerable<T> Keys {			get { return _table.Keys; }		}		public override IEnumerable<TU> Values {			get { return _table.Values; }		}	}}
 |