【面試一個個啃】Java面試:Java基礎面試 :說說ArrayList,StringBuilder,HashMap爲啥線程不安全?

問:

說說ArrayList,StringBuilder,HashMap爲啥線程不安全?

面試官心裏:

考察面試者對常見問題的深入理解程度以及是否有看源碼的習慣。

答:

1,翻開Vector,StringBuffer,Hashtable的源碼,第一個印象就是synchronized這個關鍵詞不要錢的,往上堆就行了,所以,這幾個類肯定是線程安全的了。

2,但是這些類完成的功能是否都需要在多線程環境下呢?顯然不是,所以 ArrayList,StringBuilder,HashMap就出現了。

ArrayList

在多個地方不安全,例如:

  • 判斷集合大小,再添加元素,容易數組越界
  • 判斷集合大小,添加元素,不越界但可能會相互覆蓋

StringBuilder

在擴容,給字符數組同一個位置賦值時,會相互覆蓋

HashMap

  • 在擴容階段(size*2)容易出現線程不安全
    • >> 擴容會重新計算hash,重新分桶,兩個線程操作,容易形成循環依賴(jdk1.7出現,jdk1.8因爲用紅黑樹優化,不會出現死循環)
    • >> 擴容會重新計算hash,重新分桶,兩個線程操作,一個成功擴容,另外一個數據就會丟失(1.7和1.8都會出現)。
  • 在put階段:先計算hash的位置,再賦值,兩步操作,容易出現線程安全問題,覆蓋前值(1.7和1.8都會出現)。
  • 使用ConcurrentHashMap處理併發情況

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章