Vector 線程安全嗎,HashTable線程安全嗎


Vector 他的實現原理和ArrayList,只不過在增刪查改的時候,加了鎖標記。

Vector 不是絕對的線程安全。

 

比如線程有現在A和B,同時add的話,因為add方法加了鎖標記synchronized,所以如果A先拿到了這個鎖,這個鎖就是這個對象的實例,然后B必須要等待,等A釋放鎖之后,會去那鎖,這時候都是安全的

 

但是現在就是代碼里面寫了,先判斷這個里面contains 有沒有這個值,如果沒有這個值,在調用add,這樣就會有問題,比如A在調用Add的時候,B正好在走到了判斷是否包含對的,那這樣b在add時候,其實這樣就會加入重復的。

因為他的contains沒有加鎖,所以他不是絕對安全的。

 

HashTable 所有的方法都加了鎖標記,所以他是線程安全的。

 

HashTable 和 HashMap的主要的比較

2個的存儲結構都差不多,但是hash值的算法都不一樣,HashTable默認的初始大小為11,之后每次擴充為原來的2n+1,但是HashMap都是2的冪次方。

也就是說HashTable會盡量使用素數、奇數。而HashMap則總是使用2的冪作為哈希表的大小。我們知道當哈希表的大小為素數時,簡單的取模哈希的結果會更加均勻,

所以hashTable的大小選擇比較好,但是果模數是2的冪,那么我們可以直接使用位運算來得到結果,效率要大大高於做除法。所以從hash計算的效率上,又是HashMap更勝一籌

 

Hashtable中,key和value都不允許出現null值。但是如果在Hashtable中有類似put(null,null)的操作,編譯同樣可以通過,因為key和value都是Object類型,但運行時會拋出NullPointerException異常

HashMap中 ,key 和value 可以是null。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM