Java集合中那些類別是線程安全的
線程安全類別
在集合框架中,有些類別是線程安全的,這些都是jdk1.1中的出現的。在jdk1.2之後,就出現許許多多非執行緒安全的類別。 以下是這些執行緒安全的同步的類別:
vector:就比arraylist多了個同步化機制(執行緒安全),因為效率較低,現在已經不太建議使用。在web應用中,特別是前台頁面,往往效率(頁面響應速度)是優先考慮的。
statck:堆疊類,先進後出
hashtable:就比hashmap多了個線程安全
enumeration:枚舉,相當於迭代器
除了這些之外,其他的都是非線程安全的類和接口。
執行緒安全的類別其方法是同步的,每次只能一個存取。是重量級對象,效率較低。
其他:
1. hashtable跟hashmap的區別
hashtable是線程安全的,即hashtable的方法都提供了同步機制;hashmap不是線程安全的,即不提供同步機制;hashtable不允許插入空值, hashmap允許!
2. 多執行緒並發修改一個集合怎麼辦
用老的Vector/Hashtable類別
StringBuffer是執行緒安全,而StringBuilder是執行緒不安全的。對於安全與不安全沒有深入的理解情況下,易造成這樣的錯覺,如果對於StringBuffer的操作均是線程安全的,然而,Java給你的保證的線程安全,是說它的方法是執行是排它的,而不是對這個物件本身的多次呼叫情況下,還是安全的。看看下邊的例子,在StringBufferTest中有一個資料成員contents它是用來擴展的,它的每一次append是線程安全的,但眾多次append的組合並不是線程安全的,這個輸出結果不是太可控的,但如果對於log和getContest方法加關鍵字synchronized,那麼結果就會變得非常條理,如果換成StringBuider甚至是append到一半,它也會讓位於其它在此基礎上操作的線程:
public class StringBufferTest { private StringBuffer contents = new StringBuffer(); public void log(String message){ contents.append(System.currentTimeMillis()); contents.append("; "); contents.append(Thread.currentThread().getName()); for(int i=0;i<10000;i++){ contents.append(i); contents.append(message); //append本身是线程安全的,修改contents时,其它线程无法访问。 contents.append("\n"); } contents.append("\n\n"); } public void getContents(){ System.out.println(contents); } } class RunThread extends Thread{ String message; StringBufferTest buffer; public RunThread(StringBufferTest buffer, String message){ this.buffer = buffer; this.message = message; } public void run(){ while(true){ buffer.log(message); buffer.getContents(); } } public static void main(String[] args) { StringBufferTest ss = new StringBufferTest(); new RunThread(ss, "you").start(); new RunThread(ss, "me").start(); new RunThread(ss, "she").start(); } }
StringBuilder和StringBuffer的方法是一模一樣,就是一個多執行緒、一個單執行緒的問題。執行緒呼叫同一StringBuffer 的append方法,這跟他是不是線程安全沒有關係的,除非你的結果是append的一系列字串變亂了,那才能說明他是線程不安全的。線程安全是指任何時刻都只有一個執行緒存取臨界資源。線程安全 並不是說他的一系列操作是同步的 只是對於他執行某個方法的時候不允許別的線程去改變。針對一個類別來說是不是執行緒安全就要看,多個執行緒同時在運行,這些執行緒可能會同時執行某個方法。但是每次運行結果和單執行緒執行的結果一樣,那麼就可以說是線程安全的。因為log方法沒有上鎖,每個現在在append鎖釋放後,都可能得到cpu的執行片段。
但不要對多執行緒安全有誤解:
public String toString(){ StringBuffer buffer = new StringBuffer(); buffer.append('<'); buffer.append(this.name); buffer.append('>'); return buffer.toString(); }
這個程式碼是完全執行緒安全的,在方法內部定義的變量,在每個執行緒執行緒進入的時候都會創建這個局部變數!不涉及線程安全問題。通常涉及系統安全的變數一般都是成員變數! stringBuffer本身的內部實作是現場安全的!線程安全那是類別本身提供的功能是安全的。即你提供插入一個字串,那麼這個字串插入是安全的,但是要插入兩個字串,兩個的順序你來定,這之間如果有別的插入出錯就不管類的事情了,是你自己代碼的問題。
感謝閱讀,希望能幫助大家,謝謝大家對本站的支持!
更多Java 集合中的類別關於線程安全相關文章請關注PHP中文網!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

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

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

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

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器