Esempio n. 1
0
        /// <summary>子类重载实现资源释放逻辑时必须首先调用基类方法</summary>
        /// <param name="disposing">从Dispose调用(释放所有资源)还是析构函数调用(释放非托管资源)</param>
        protected override void OnDispose(bool disposing)
        {
            base.OnDispose(disposing);

            Clear();
            Top = null;
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 /// <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);
 }
Esempio n. 4
0
        /// <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);
            }
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        /// <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;
            }
        }
Esempio n. 7
0
 /// <summary>使用一个对象和下一个节点初始化一个节点</summary>
 /// <param name="item"></param>
 /// <param name="next"></param>
 public SingleListNode(T item, SingleListNode <T> next)
 {
     Item = item;
     Next = next;
 }