线程安全的集合

1.ConcurrentBag

表示对象的线程安全的无序集合。

2.ConcurrentDictionary

表示可由多个线程同时访问的键/值对的线程安全集合。

3.ConcurrentQueue

表示线程安全的先进先出 (FIFO) 集合

4.ConcurrentStack

表示线程安全的后进先出 (LIFO) 集合。

5.利用HashTanle实现线程安全

如果想锁整个 hashtable, 包括读和写, 即不允许并发的读和写, 那应该锁 hashtable 实例。
如果想允许并发的读, 不允许并发的写, 那应该创建 Synchronized 的 hashtable, 并对要加锁的一块代码用 SyncRoot 锁住(测试代码如下)。如果不需要对一块代码加锁, 则 hashtable 会自动对单个写的操作加锁。

class Program
    {
        static void Main(string[] args)
        {
            TestLock();
            Console.ReadLine();
        }
       static Hashtable hashtable = Hashtable.Synchronized(new Hashtable());
        static string keya = "a";
        public static void TestLock()
        {
            Thread t1 = new Thread(new ThreadStart(SyncFunctionA));
            Thread t2 = new Thread(new ThreadStart(SyncFunctionB));

            t1.Start();
            t2.Start();

            Thread.Sleep(3000);

            Console.WriteLine("hashtable[" + keya + "] = " + hashtable[keya]);
        }
        private static void SyncFunctionA()
        {
            lock (hashtable.SyncRoot)
            {
                Thread.Sleep(1000);
                hashtable[keya] = "Value set by SyncFunctionA";
            }
        }

        private static void SyncFunctionB()//这里写了之后,SyncFunctionA()里就不能再写
        {
            Console.WriteLine("hashtable[" + keya + "] = " + hashtable[keya]);
            hashtable[keya] = "Value set by SyncFunctionB";
        }

    }
View Code

6.BlockingCollection<T>

 

参考:C#中Hashtable和Dictionary的用法和区别SyncRoot 属性_C# 中的线程安全集合类

posted @ 2021-12-12 20:10  HelloWorld庄先生  阅读(712)  评论(0编辑  收藏  举报