如何实现哈希表的多线程同步读写
[c]Object syncObj = new Object(); Hashtable htObj = new Hashtable; Thread thr1st = new Thread(new ThreadStart(func_thr1st)); Thread thr2nd = new Thread(new ThreadStart(func_thr2nd)); Thread thr3th = new Thread(new ThreadStart(func_thr3th)); private void func_thr1st() { lock(syncObj) { //do something //htObj.Add() or htObj.Remove() or enumerate htObj; } } private void func_thr1st() { lock(syncObj) { //do something //htObj.Add() or htObj.Remove() or enumerate htObj; } } private void func_thr1st() { lock(syncObj) { //do something //htObj.Add() or htObj.Remove() or enumerate htObj; } } 上面就是達到Hashtable線程同步的做法,下面是等效的做法: Object syncObj = new Object(); Hashtable htObj = Hashtable.Synchronized(new Hashtable()); Thread thr1st = new Thread(new ThreadStart(func_thr1st)); Thread thr2nd = new Thread(new ThreadStart(func_thr2nd)); Thread thr3th = new Thread(new ThreadStart(func_thr3th)); private void func_thr1st() { htObj.Add(); htObj.Remove(); lock(syncObj) { //do something //enumerate htObj; } } private void func_thr1st() { htObj.Add(); htObj.Remove(); lock(syncObj) { //do something //enumerate htObj; } } private void func_thr1st() { htObj.Add(); htObj.Remove(); lock(syncObj) { //do something //enumerate htObj; } } //Hashtable htObj = Hashtable.Synchronized(new Hashtable()); //這樣獲得了Hashtable的同步對象之后,當Add或者Remove的時候, //htObj會自動用lock鎖住自己,所以不需要在外面用lock, //但因為枚舉集合類型都不是線程安全的,所以執行枚舉操作的時候仍需在外部用lock[/c]
本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:licqi@yunshuaiweb.com