日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java各种集合的线程安全

發布時間:2023/12/3 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java各种集合的线程安全 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自??java各種集合的線程安全

?

  • 線程安全
  • 首先要明白線程的工作原理,jvm有一個main memory,而每個線程有自己的working?
    memory,一個線程對一個variable進行操作時,都要在自己的working?
    memory里面建立一個copy,操作完之后再寫入main?
    memory。多個線程同時操作同一個variable,就可能會出現不可預知的結果。根據上面的解釋,很容易想出相應的scenario。?
    而用synchronized的關鍵是建立一個monitor,這個monitor可以是要修改的variable也可以其他你認為合適的object比如method,然后通過給這個monitor加鎖來實現線程安全,每個線程在獲得這個鎖之后,要執行完?
    load到workingmemory -> use&assign -> store到mainmemory?
    的過程,才會釋放它得到的鎖。這樣就實現了所謂的線程安全。

    什么是線程安全?線程安全是怎么完成的(原理)? 線程安全就是說多線程訪問同一代碼,不會產生不確定的結果。編寫線程安全的代碼是低依靠線程同步。

  • java相關集合

    • Vector、ArrayList、LinkedList

    Vector和ArrayList在使用上非常相似,都可用來表示一組數量可變的對象應用的集合,并且可以隨機地訪問其中的元素。??
    ?Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法不是,由于線程的同步必然要影響性能,因此,ArrayList的性能比Vector好。??
    ?

    • ArrayList和LinkedList區別??

    ?

       對于處理一列數據項,Java提供了兩個類ArrayList和LinkedList,ArrayList的內部實現是基于內部數組Object[],所以從概念上講,它更象數組,但LinkedList的內部實現是基于一組連接的記錄,所以,它更象一個鏈表結構,所以,它們在性能上有很大的差別。??   從上面的分析可知,在ArrayList的前面或中間插入數據時,你必須將其后的所有數據相應的后移,這樣必然要花費較多時間,所以,當你的操作是在一列數據的后面添加數據而不是在前面或中間,并且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能??
       而訪問鏈表中的某個元素時,就必須從鏈表的一端開始沿著連接方向一個一個元素地去查找,直到找到所需的元素為止,所以,當你的操作是在一列數據的前面或中間添加或刪除數據,并且按照順序訪問其中的元素時,就應該使用LinkedList了。??
       如果在編程中,1,2兩種情形交替出現,這時,你可以考慮使用List這樣的通用接口,而不用關心具體的實現,在具體的情形下,它的性能由具體的實現來保證。? ??

    ?

    • HashTable,HashMap,HashSet

    HashTable和HashMap采用相同的存儲機制,二者的實現基本一致,不同的是:
    1)、HashMap是非線程安全的,HashTable是線程安全的,內部的方法基本都是synchronized。
    2)、HashTable不允許有null值的存在。

    在HashTable中調用put方法時,如果key為null,直接拋出NullPointerException。其它細微的差別還有,比如初始化Entry數組的大小等等,但基本思想和HashMap一樣。

    ?

    HashSet:
    1、HashSet基于HashMap實現,無容量限制。
    2、HashSet是非線程安全的。?
    3、HashSet不保證有序。?

    HashMap:
    1、HashMap采用數組方式存儲key,value構成的Entry對象,無容量限制。
    2、HashMap基于Key hash查找Entry對象存放到數組的位置,對于hash沖突采用鏈表的方式來解決。
    3、HashMap在插入元素時可能會要擴大數組的容量,在擴大容量時須要重新計算hash,并復制對象到新的數組中。
    4、HashMap是非線程安全的。
    5、HashMap遍歷使用的是Iterator?

    HashTable
    1、HashTable是線程安全的。
    2、HashTable中無論是Key,還是Value都不允許為null。
    3、HashTable遍歷使用的是Enumeration。?


    • TreeSet,TreeMap

    ?TreeSet:
    ?1、TreeSet基于TreeMap實現,支持排序。
    ?2、TreeSet是非線程安全的。

    ? ? 從對HashSet和TreeSet的描述來看,TreeSet和HashSet一樣,也是完全基于Map來實現的,并且都不支持get(int)來獲取指定位置的元素(需要遍歷獲取),另外TreeSet還提供了一些排序方面的支持。例如傳入Comparator實現、descendingSet以及descendingIterator等。

    TreeMap:?
    1、TreeMap是一個典型的基于紅黑樹的Map實現,因此它要求一定要有Key比較的方法,要么傳入Comparator實現,要么key對象實現Comparable接口。
    2、TreeMap是非線程安全的。

    ?

    總結

    以上是生活随笔為你收集整理的java各种集合的线程安全的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。