深入理解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影片教學】
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,HashSetHashTable和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
HashTable1、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各種集合的線程安全的全部內容,希望對大家有幫助。
本文來自 java入門 欄目,歡迎學習!
以上是深入理解java各種集合的線程安全的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。
