談談Java中的線程安全集合

  • 首先集合中線程安全的有如下:

    • Vector

    • Stack

    • HashTable

    • Enumeration

 

一、爲什麼Vector線程安全?

  • Vector的所有操作都被同步了,既然被同步了,多線程就不可能同時訪問Vector中的數據,只能一個一個地方問,所以不會出現數據混亂的情況,線程是安全的。

  • 下圖是Vector源碼的部分,其中Vector is synchronized,表示Vector的操作是同步的;

 

  • 我們再去看一下具體實現的方法,確實是被synchronized修飾的;

 

 

二、爲什麼Stack線程安全?

  • 我們來看源碼,這裏其實跟Vector類似;

  • Stack繼承自Vector,並且所有方法也均是synchronized同步的,所以線程安全;

 

 

 

三、HashTable爲什麼是線程安全的?

  • HashTable我們也來看源碼部分;

  • 我們可以看到也是用Map來實現的HashTable,然後其所有的操作方法也均由synchronized,因此線程安全;

 

 

 

四、爲什麼Enumeration是線程安全的?

  • 是因爲當我們使用關鍵字Enum定義了一個枚舉類,在編譯的時候,默認會創建一個final類型的類來繼承Enum類,因此我們定義的類是不能繼承的;

  • 其次枚舉類中定義的每個元素,在編譯時都默認的加載爲static final修飾;

  • 因爲static類型的屬性會在類加載之後被初始化,當Java類第一次被真正使用到的時候靜態資源被初始化、Java類的加載和初始化都是線程安全的,而且final修飾是不能被修改和重寫的,因此Enumeration是安全的;

 

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