HashTable 线程安全

HashTable是经过优化的,访问下标的对象先散列过,所以内部是无序散列的,保证了高效率,也就是说,其输出不是按照开始加入的顺序,而Dictionary遍历输出的顺序,就是加入的顺序,这点与Hashtable不同。如果一定要排序HashTable输出,只能自己实现:


    //Hashtable sorting
    System.Collections.ArrayList akeys = new System.Collections.ArrayList(ht.Keys); //from Hashtable
    akeys.Sort(); //Sort by leading letter
    foreach (string skey in akeys)
    {
        Console.Write(skey + ":");
        Console.WriteLine(ht[skey]);
    }
  

HashTable与线程安全:

为了保证在多线程的情况下的线程同步访问安全,微软提供了自动线程同步的HashTable: 


如果 HashTable要允许并发读但只能一个线程写, 要这么创建 HashTable实例:

    //Thread safe HashTable
    System.Collections.Hashtable htSyn = System.Collections.Hashtable.Synchronized(new System.Collections.Hashtable());
这样, 如果有多个线程并发的企图写HashTable里面的 item, 则同一时刻只能有一个线程写, 其余阻塞; 对读的线程则不受影响。   

另外一种方法就是使用lock语句,但要lock的不是HashTable,而是其SyncRoot;虽然不推荐这种方法,但效果一样的,因为源代码就是这样实现的:

    //Thread safe
    private static Hashtable htCache = new Hashtable();

    public static void AccessCache()
    {
        lock (htCache.SyncRoot)
        {
            //Do something
        }
    }

你可能感兴趣的:(C#(Winform))