欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解java各種集合的線程安全

 更新時間:2017年10月11日 16:40:43   作者:augustliang  
這篇文章主要介紹了詳解java各種集合的線程安全,小編覺得挺不錯的,這里分享給大家,供需要的朋友參考。

線程安全

首先要明白線程的工作原理,jvm有一個main memory,而每個線程有自己的working

memory,一個線程對一個variable進行操作時,都要在自己的working

memory里面建立一個copy,操作完之后再寫入main

memory。多個線程同時操作同一個variable,就可能會出現(xiàn)不可預知的結(jié)果。根據(jù)上面的解釋,很容易想出相應的scenario。

而用synchronized的關鍵是建立一個monitor,這個monitor可以是要修改的variable也可以其他你認為合適的object比如method,然后通過給這個monitor加鎖來實現(xiàn)線程安全,每個線程在獲得這個鎖之后,要執(zhí)行完load到workingmemory -> use&assign -> store到mainmemory 的過程,才會釋放它得到的鎖。這樣就實現(xiàn)了所謂的線程安全。

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

java相關集合

Vector、ArrayList、LinkedList

Vector和ArrayList在使用上非常相似,都可用來表示一組數(shù)量可變的對象應用的集合,并且可以隨機地訪問其中的元素。 

   Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法不是,由于線程的同步必然要影響性能,因此,ArrayList的性能比Vector好。  

    ArrayList和LinkedList區(qū)別 

   對于處理一列數(shù)據(jù)項,Java提供了兩個類ArrayList和LinkedList,ArrayList的內(nèi)部實現(xiàn)是基于內(nèi)部數(shù)組Object[],所以從概念上講,它更象數(shù)組,但LinkedList的內(nèi)部實現(xiàn)是基于一組連接的記錄,所以,它更象一個鏈表結(jié)構(gòu),所以,它們在性能上有很大的差別。 

   從上面的分析可知,在ArrayList的前面或中間插入數(shù)據(jù)時,你必須將其后的所有數(shù)據(jù)相應的后移,這樣必然要花費較多時間,所以,當你的操作是在一列數(shù)據(jù)的后面添加數(shù)據(jù)而不是在前面或中間,并且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能 

   而訪問鏈表中的某個元素時,就必須從鏈表的一端開始沿著連接方向一個一個元素地去查找,直到找到所需的元素為止,所以,當你的操作是在一列數(shù)據(jù)的前面或中間添加或刪除數(shù)據(jù),并且按照順序訪問其中的元素時,就應該使用LinkedList了。 

   如果在編程中,1,2兩種情形交替出現(xiàn),這時,你可以考慮使用List這樣的通用接口,而不用關心具體的實現(xiàn),在具體的情形下,它的性能由具體的實現(xiàn)來保證。   

HashTable,HashMap,HashSet

HashTable和HashMap采用相同的存儲機制,二者的實現(xiàn)基本一致,不同的是:

1)、HashMap是非線程安全的,HashTable是線程安全的,內(nèi)部的方法基本都是synchronized。

2)、HashTable不允許有null值的存在。

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

HashSet:

1、HashSet基于HashMap實現(xiàn),無容量限制。

2、HashSet是非線程安全的。

3、HashSet不保證有序。

HashMap:

1、HashMap采用數(shù)組方式存儲key,value構(gòu)成的Entry對象,無容量限制。

2、HashMap基于Key hash查找Entry對象存放到數(shù)組的位置,對于hash沖突采用鏈表的方式來解決。

3、HashMap在插入元素時可能會要擴大數(shù)組的容量,在擴大容量時須要重新計算hash,并復制對象到新的數(shù)組中。

4、HashMap是非線程安全的。

5、HashMap遍歷使用的是Iterator

HashTable

1、HashTable是線程安全的。

2、HashTable中無論是Key,還是Value都不允許為null。

3、HashTable遍歷使用的是Enumeration。

TreeSet,TreeMap

TreeSet:

1、TreeSet基于TreeMap實現(xiàn),支持排序。

2、TreeSet是非線程安全的。

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

TreeMap:

1、TreeMap是一個典型的基于紅黑樹的Map實現(xiàn),因此它要求一定要有Key比較的方法,要么傳入Comparator實現(xiàn),要么key對象實現(xiàn)Comparable接口。

2、TreeMap是非線程安全的。

總結(jié)

以上就是本文關于詳解java各種集合的線程安全的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以參閱:Java多線程ForkJoinPool實例詳解、Java線程安全與非線程安全解析、Java利用future及時獲取多線程運行結(jié)果等,有什么問題可以隨時留言,歡迎大家交流討論。

相關文章

  • Java當中讓事務回滾的幾種方式

    Java當中讓事務回滾的幾種方式

    這篇文章主要給大家介紹了關于Java當中讓事務回滾的幾種方式, 事務回滾通常用于在某些操作失敗時取消之前已執(zhí)行的所有操作,這樣,我們就可以保證數(shù)據(jù)的一致性,需要的朋友可以參考下
    2023-08-08
  • JavaWeb之監(jiān)聽器案例講解

    JavaWeb之監(jiān)聽器案例講解

    這篇文章主要介紹了JavaWeb之監(jiān)聽器案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Junit springboot打印測試方法信息

    Junit springboot打印測試方法信息

    這篇文章主要介紹了Junit springboot打印測試方法信息,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 談談你可能并不了解的java枚舉

    談談你可能并不了解的java枚舉

    這篇文章主要給大家介紹了一些關于你可能并不了解的java枚舉的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Spring Security基于JWT登錄認證的項目實踐

    Spring Security基于JWT登錄認證的項目實踐

    JWT被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,本文主要介紹了Spring Security基于JWT登錄認證的項目實踐,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Java使用POI導出Excel(二):多個sheet

    Java使用POI導出Excel(二):多個sheet

    這篇文章介紹了Java使用POI導出Excel的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • SpringBoot對接AWS?S3實現(xiàn)上傳和查詢

    SpringBoot對接AWS?S3實現(xiàn)上傳和查詢

    AWS?S3是亞馬遜提供的一種對象存儲服務,旨在提供可擴展、高可用性和安全的數(shù)據(jù)存儲解決方案,本文我們就來看看SpringBoot如何對接AWS?S3實現(xiàn)上傳和查詢吧
    2025-02-02
  • RestTemplate使用不當引發(fā)的問題及解決

    RestTemplate使用不當引發(fā)的問題及解決

    這篇文章主要介紹了RestTemplate使用不當引發(fā)的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 一篇文章學會java死鎖與CPU 100%的排查

    一篇文章學會java死鎖與CPU 100%的排查

    這篇文章主要介紹了一篇文章學會java死鎖與CPU 100%的排查,文中主要介紹了Java死鎖以及服務器CPU占用率達到100%時的排查和解決方法,感興趣的朋友一起來看一看吧
    2021-08-08
  • SpringBoot實現(xiàn)自動配置的方式詳解

    SpringBoot實現(xiàn)自動配置的方式詳解

    Spring Boot 自動配置 是其核心特性之一,它通過智能化的默認配置減少了開發(fā)者的工作量,自動配置的原理基于條件化配置和 Spring 的 @Configuration 機制,本文給大家講解了SpringBoot實現(xiàn)自動配置的過程,需要的朋友可以參考下
    2025-04-04

最新評論