基礎才是重中之重 執行緒安全的Hashtable

2021-09-22 13:36:41 字數 1498 閱讀 5866

執行緒安全就是多執行緒訪問時(web網頁多使用者訪問乙個頁面時),採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。

hashtable 表示鍵/值對的集合,這些鍵/值對根據鍵的雜湊**進行組織,它的key不能為null,value可以為null,這一點與hashmap不同(本身不是執行緒安全的),對於hashtable它是實現了idictionary和icollection介面的,它的key與value都是object型別的,不支援泛型,進行型別轉換成需要裝箱與拆箱(boxing,unboxing),這在效能肯定會有一些影響,所以,微軟這邊給出了支援泛型的鍵值對集合dictionary,而dictionary本身也不是執行緒安全的,我們需要對它加鎖(lock),才能避免多執行緒環境下產生的一些錯誤。

下面我們來看一下執行緒安全的hashtable**片斷:

hashtable ht = hashtable.synchronized(new

hashtable());

ht.add("ok

", null

); console.writeline(ht["ok

"]);

我們在來看一下dictionary物件,可以使它基類提供的syncroot屬性,來實現它內部物件的執行緒安全  

dictionary dic = new dictionary();

lock ((dic as

icollection).syncroot)

下面我們來做乙個例項,還是dictionary的執行緒安全問題,我們有兩個執行緒,t1和t2,當我們為它加lock之後,t1純種在進行dic.ad操作時,t2並不能進行訪問

當t1完成add操作後,t2執行緒才進行執行,這時它就可以改變dic 元素的值了,程式執行正常,但如果沒有lock鎖機制,t1與 t2執行緒誰先執行就不確定了,這時,

如果t1先執行,當然沒有問題,但如果t2先操作了,程式出現異常,因為dic元素沒有被add,所以無法改變其值。

看**:

dictionary dic = new dictionary();

thread t1 = new thread(() =>

});thread t2 = new thread(() =>

});t1.start();

t2.start();

thread.sleep(

2000);

而對於hashtable來說,如果希望對它進行寫加鎖,讀不加鎖,也可以通過lock在**段時去實現

thread t1 = new thread(() =>

});

ok,對於hashtable的執行緒安全這塊就說到這裡,最後和大家說一下,咱們做web開發的工程師們,一定要注意執行緒安全這塊的知識,因為你寫的程式,肯定是處

於多執行緒環境下的,呵呵。

基礎才是重中之重 執行緒安全的Hashtable

執行緒安全就是多執行緒訪問時 web網頁多使用者訪問乙個頁面時 採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。hashtable 表示鍵 值對的集合,這些鍵 值對根據鍵的雜湊 進行組織,它的k...

基礎才是重中之重 位的運算

回到目錄 位運算無論在 還是在 裡都有對它支援,位運算即對數值型別的每位進行計算,對於程式裡,你可以使用十進位制,十六進製制,二進位制對它進行位運算,事實上無論你使用哪種進製,對於計算機來說最後都為把它轉換成二進位制 的形式,因為二進位制為簡單,呵呵。下面是關於位運算的 運算符號 位運算操作符 運算...

基礎才是重中之重 方法override詳解

回到 目錄 方法的override,即方法的覆寫或者重寫,有時還是習慣叫它英文override,它是指將父類的abstract或者virtual方法進行重新設計,可以將新的功能加入其中,看起來很不錯,但在使用過程中,有時我們可能拿不準它,下面我說幾點 一 父類是抽象類,這時,它的例項化需要通過子類來...