Java 集合中的類關(guān)于線程安全
Java集合中那些類是線程安全的
線程安全類
在集合框架中,有些類是線程安全的,這些都是jdk1.1中的出現(xiàn)的。在jdk1.2之后,就出現(xiàn)許許多多非線程安全的類。 下面是這些線程安全的同步的類:
vector:就比arraylist多了個同步化機制(線程安全),因為效率較低,現(xiàn)在已經(jīng)不太建議使用。在web應(yīng)用中,特別是前臺頁面,往往效率(頁面響應(yīng)速度)是優(yōu)先考慮的。
statck:堆棧類,先進后出
hashtable:就比hashmap多了個線程安全
enumeration:枚舉,相當于迭代器
除了這些之外,其他的都是非線程安全的類和接口。
線程安全的類其方法是同步的,每次只能一個訪問。是重量級對象,效率較低。
其他:
1. hashtable跟hashmap的區(qū)別
hashtable是線程安全的,即hashtable的方法都提供了同步機制;hashmap不是線程安全的,即不提供同步機制 ;hashtable不允許插入空值,hashmap允許!
2. 多線程并發(fā)修改一 個 集合 怎么辦
用老的Vector/Hashtable類
StringBuffer是線程安全,而StringBuilder是線程不安全的。對于安全與不安全沒有深入的理解情況下,易造成這樣的錯覺,如果對于StringBuffer的操作均是線程安全的,然而,Java給你的保證的線程安全,是說它的方法是執(zhí)行是排它的,而不是對這個對象本身的多次調(diào)用情況下,還是安全的??纯聪逻叺睦?,在StringBufferTest中有一個數(shù)據(jù)成員contents它是用來擴展的,它的每一次append是線程安全的,但眾多次append的組合并不是線程安全的,這個輸出結(jié)果不是太可控的,但如果對于log和getContest方法加關(guān)鍵字synchronized,那么結(jié)果就會變得非常條理,如果換成StringBuider甚至是append到一半,它也會讓位于其它在此基礎(chǔ)上操作的線程:
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的方法是一模一樣,就是一個多線程和一個單線程的問題。線程調(diào)用同一StringBuffer 的append方法,這跟他是不是線程安全沒有關(guān)系的,除非你的結(jié)果是append的一系列字符串變亂了,那才能說明他是線程不安全的。線程安全是指任何時刻都只有一個線程訪問臨界資源。線程安全 并不是說他的一系列操作是同步的 只是對于他執(zhí)行某個方法的時候不允許別的線程去改變。針對一個類來說是不是線程安全就要看,多個線程在同時在運行,這些線程可能會同時執(zhí)行某個方法。但是每次運行結(jié)果和單線程執(zhí)行的結(jié)果一樣,那么就可以說是線程安全的。因為log方法沒有上鎖,每個現(xiàn)在在append鎖釋放后,都可能得到cpu的執(zhí)行片段。
但不要對多線程安全存在誤解:
public String toString(){ StringBuffer buffer = new StringBuffer(); buffer.append('<'); buffer.append(this.name); buffer.append('>'); return buffer.toString(); }
這個代碼是完全線程安全的,在方法內(nèi)部定義的變量,在每個線程線程進入的時候都會創(chuàng)建這個局部變量!不涉及線程安全問題。通常涉及系統(tǒng)安全的變量一般都是成員變量! stringBuffer本身的內(nèi)部實現(xiàn)是現(xiàn)場安全的!線程安全那是類本身提供的功能是安全的。即你提供插入一個字符串,那么這個字符串插入是安全的,但是要插入兩個字符串,兩個的順序你來定,這之間如果有別的插入出錯就不管類的事情了,是你自己代碼的問題。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
SpringBoot實現(xiàn)文件在線預(yù)覽功能的全過程
我們開發(fā)業(yè)務(wù)系統(tǒng)的時候,經(jīng)常有那種文檔文件在線預(yù)覽的需求,下面這篇文章主要給大家介紹了關(guān)于SpringBoot實現(xiàn)文件在線預(yù)覽功能的相關(guān)資料,需要的朋友可以參考下2021-11-11Java實現(xiàn)一鍵將Word文檔轉(zhuǎn)為PDF的兩種方法
本文主要介紹了Java實現(xiàn)一鍵將Word文檔轉(zhuǎn)為PDF的兩種方法,分別使用Apache POI和Docx4J結(jié)合iText庫來實現(xiàn)Word轉(zhuǎn)PDF,具有一定的參考價值,感興趣的可以了解一下2025-04-04在Mybatis @Select注解中實現(xiàn)拼寫動態(tài)sql
這篇文章主要介紹了在Mybatis @Select注解中實現(xiàn)拼寫動態(tài)sql,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11解決fcitx輸入法在IDEA中輸入法候選框無法跟隨光標移動的問題
這篇文章主要介紹了解決fcitx輸入法在Intellij IDEA開發(fā)工具中輸入法候選框無法跟隨光標移動的問題,代碼簡單易懂對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10一文帶你掌握Java?LinkedBlockingQueue
LinkedBlockingQueue?是一個可選有界阻塞隊列,這篇文章主要為大家詳細介紹了Java中LinkedBlockingQueue的實現(xiàn)原理與適用場景,感興趣的可以了解一下2023-04-04