猿问

这段代码能保证多线程安全吗?

 public class DoubleCacheQueue<T>
    {

        public DoubleCacheQueue()
        { }
        public T Dequeue()
        {
            T t = default(T);
           
                if (readQueue.Count > 0)
                    t= readQueue.Dequeue();
                else
                {
                    writeQueue = Interlocked.Exchange<Queue<T>>(ref readQueue, writeQueue);                   
                }           
            return t;
        }
        public void Enqueue(T item)
        {
                writeQueue.Enqueue(item);
        }

        public int Count
        {
            get { return readQueue.Count; }
        }
        //读缓冲
        private Queue<T> readQueue = new Queue<T>();
        //写缓冲
        private Queue<T> writeQueue = new Queue<T>();

    }

问下大家,这段代码能保证多线程安全吗?

哆啦的时光机
浏览 419回答 5
5回答

慕妹3146593

No。 队列只剩一项数据时,并发去Dequeue可能会出异常。Queue<T>考虑常规则应用的效率,应该不会提供并发检查。

繁花不似锦

个人认为应该不是线程安全的 Dequeue和Enqueue方法都是直接操作Queue,而对Queue的线程安全MSDN上说法如下: 此类型的公共静态成员是线程安全的。但不能保证任何实例成员是线程安全的。 所以个人认为应该不是线程安全的

海绵宝宝撒

内部是俩个q,不是一个,每个线程各操作一个

交互式爱情

非线程安全,不能确保在多线程情况下的读写。 但是只是一个线程读,一个线程写的情况下可以。 根据业务应用来设计自己的数据结构操作,不一定非要完全线程安全。 在实施服务器连接管理器时,频繁的上线、下线对于服务器的连接管理器hashtable加锁势必会增加服务器的开销,使得效率低下
随时随地看视频慕课网APP
我要回答