日期:2014-05-18  浏览次数:20733 次

Hashtable有多个线程写是不是线程安全的?
我有个类A
Hashtable作为一个类的成员,
然后起了100个线程,
每个线程函数不停得执行把结果返回给一个类A的回调函数,这个回调函数就是把线程们返回的结果添加到Hashtable里去,并且更新界面上的状态。
这个回调函数如果我采用lock(hashtable.SyncRoot)
程序就会死掉。
如果不lock,好像一切都正常界面上能显示出Hashtable里的信息,100个线程返回的都成功了。
我很奇怪,难道多个线程写也是没问题?我做lock操作多余了吗

------解决方案--------------------
Hashtable 是线程安全的,可由多个读取器线程或一个写入线程使用。多线程使用时,如果任何一个线程执行写入(更新)操作,它都不是线程安全的。若要支持多个编写器,如果没有任何线程在读取 Hashtable 对象,则对 Hashtable 的所有操作都必须通过 Synchronized 方法返回的包装完成。

从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。即使一个集合已进行同步,其他线程仍可以修改该集合,这将导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。
------解决方案--------------------
可能是代码编写不当导致互锁,审阅一下你的代码吧。