/// <summary>子类重载实现资源释放逻辑时必须首先调用基类方法</summary> /// <param name="disposing">从Dispose调用(释放所有资源)还是析构函数调用(释放非托管资源)</param> protected override void OnDispose(bool disposing) { base.OnDispose(disposing); Clear(); Top = null; }
void PushNode(SingleListNode <T> node) { // 断开关系链,避免内存泄漏 node.Item = default(T); //// 如果自由节点太多,就不要了 //if (FreeCount > MaxFreeCount) return; SingleListNode <T> newTop = node; SingleListNode <T> oldTop; //SpinWait sw = null; while (true) { // 记住当前 oldTop = FreeTop; // 设置新对象的下一个节点为当前栈顶 newTop.Next = oldTop; if (Interlocked.CompareExchange <SingleListNode <T> >(ref FreeTop, newTop, oldTop) == oldTop) { break; } Thread.SpinWait(1); //if (sw == null) sw = new SpinWait(); //sw.SpinOnce(); } Interlocked.Increment(ref FreeCount); }
/// <summary>在单向链表中查找指定项</summary> /// <param name="item"></param> /// <returns></returns> public Boolean Contain(T item) { for (SingleListNode <T> node = this; node != null; node = node.Next) { if (Object.Equals(node.Item, item)) { return(true); } } return(false); }
/// <summary>清空</summary> public void Clear() { var top = Top; _Count = 0; Top = null; for (var node = top; node != null;) { top = node; node = node.Next; // 断开关系链,避免内存泄漏 top.Next = null; top.Item = default(T); } }
/// <summary>在单向链表中移除指定项</summary> /// <param name="item">指定项</param> /// <returns></returns> public Boolean Remove(T item) { // 当前项 if (Object.Equals(Item, item)) { return(true); } // 下一项 for (SingleListNode <T> node = this; node.Next != null; node = node.Next) { if (Object.Equals(node.Next.Item, item)) { node.Next = node.Next.Next; return(true); } } return(false); }
/// <summary>向栈压入一个对象</summary> /// <remarks>重点解决多线程环境下资源争夺以及使用lock造成性能损失的问题</remarks> /// <param name="item"></param> public void Push(T item) { Debug.Assert(item != null); //SingleListNode<T> newTop = PopNode(item); SingleListNode <T> newTop = UseNodePool ? PopNode(item) : new SingleListNode <T>(item); SingleListNode <T> oldTop; //SpinWait sw = null; while (true) { // 记住当前栈顶 oldTop = Top; // 设置新对象的下一个节点为当前栈顶 newTop.Next = oldTop; // 比较并交换 // 如果当前栈顶第一个参数的Top等于第三个参数,表明没有被别的线程修改,保存第二参数到第一参数中 // 否则,不相等表明当前栈顶已经被修改过,操作失败,执行循环 if (Interlocked.CompareExchange <SingleListNode <T> >(ref Top, newTop, oldTop) == oldTop) { break; } Thread.SpinWait(1); //if (sw == null) sw = new SpinWait(); //sw.SpinOnce(); } Interlocked.Increment(ref _Count); // 数量较多时,自动采用节点池 if (!UseNodePool && _Count > 100) { UseNodePool = true; } }
/// <summary>使用一个对象和下一个节点初始化一个节点</summary> /// <param name="item"></param> /// <param name="next"></param> public SingleListNode(T item, SingleListNode <T> next) { Item = item; Next = next; }