一文詳解Java線程安全的集合有哪些

Java 提供了多種線程安全的集合,它們位于 java.util.concurrent 包下,主要分為以下幾類:
1. 阻塞隊列 (BlockingQueue)
阻塞隊列是一種特殊的隊列,當(dāng)隊列為空時,獲取元素的操作會被阻塞,直到隊列中有元素可用;當(dāng)隊列已滿時,添加元素的操作會被阻塞,直到隊列中有空閑位置。
ArrayBlockingQueue: 基于數(shù)組的有界阻塞隊列,按照 FIFO(先進先出)原則對元素進行排序。LinkedBlockingQueue: 基于鏈表的可選有界阻塞隊列(默認(rèn)無界),按照 FIFO 原則對元素進行排序。PriorityBlockingQueue: 無界阻塞隊列,支持優(yōu)先級排序。SynchronousQueue: 同步隊列,不存儲元素,每個插入操作必須等待另一個線程的移除操作,反之亦然。DelayQueue: 無界阻塞隊列,只有在延遲期滿時才能從中提取元素。LinkedTransferQueue: 一個由鏈表結(jié)構(gòu)組成的無界阻塞隊列,它在SynchronousQueue的基礎(chǔ)上添加了transfer方法。
代碼示例 (ArrayBlockingQueue):
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueExample {
public static void main(String[] args) throws InterruptedException {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
// 生產(chǎn)者線程
Thread producer = new Thread(() -> {
try {
for (int i = 0; i < 20; i++) {
queue.put("Item " + i); // 如果隊列滿了,會阻塞
System.out.println("Produced: Item " + i);
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// 消費者線程
Thread consumer = new Thread(() -> {
try {
for (int i = 0; i < 20; i++) {
String item = queue.take(); // 如果隊列為空,會阻塞
System.out.println("Consumed: " + item);
Thread.sleep(200);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
producer.start();
consumer.start();
}
}
2. 并發(fā) Map (ConcurrentMap)
ConcurrentMap 接口是 Map 接口的子接口,提供了線程安全的并發(fā)操作。
ConcurrentHashMap: 基于哈希表的線程安全 Map 實現(xiàn),使用分段鎖(JDK 1.7)或 CAS + synchronized (JDK 1.8+) 來實現(xiàn)并發(fā)控制。ConcurrentSkipListMap: 基于跳表 (Skip List) 的線程安全 Map 實現(xiàn),支持排序。
代碼示例 (ConcurrentHashMap):
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapExample {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
// 多個線程并發(fā)地向 map 中添加元素
Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
map.putIfAbsent("Key" + i, i); // 原子操作
}
};
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
thread1.start();
thread2.start();
}
}
3. 并發(fā) Set (ConcurrentSet)
ConcurrentSkipListSet: 基于跳表的線程安全的Set,支持排序。CopyOnWriteArraySet: 基于CopyOnWriteArrayList實現(xiàn)的線程安全 Set。
4. 并發(fā) List (ConcurrentList)
CopyOnWriteArrayList: 線程安全的 List 實現(xiàn),通過 寫時復(fù)制 (Copy-On-Write) 的方式來實現(xiàn)并發(fā)控制。每次修改操作都會創(chuàng)建一個新的數(shù)組副本,讀操作在原來的數(shù)組上進行,因此讀操作不需要加鎖,可以并發(fā)進行。適用于讀多寫少的場景。
代碼示例 (CopyOnWriteArrayList):
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteArrayListExample {
public static void main(String[] args) {
List<String> list = new CopyOnWriteArrayList<>();
// 讀線程
Runnable reader = () -> {
for (String item : list) {
System.out.println("Read: " + item);
}
};
// 寫線程
Runnable writer = () -> {
list.add("New Item");
System.out.println("Added: New Item");
};
}
}
5. 其他
Collections.synchronizedXXX方法:Collections工具類提供了一些靜態(tài)方法,可以將非線程安全的集合包裝成線程安全的集合,例如:Collections.synchronizedList(List<T> list)Collections.synchronizedSet(Set<T> s)Collections.synchronizedMap(Map<K,V> m)這些方法通過在每個方法上添加synchronized關(guān)鍵字來實現(xiàn)線程安全,性能較低。
總結(jié):
Java 并發(fā)包提供了豐富的線程安全集合,可以滿足不同的并發(fā)編程需求。選擇合適的線程安全集合需要考慮以下因素:
- 數(shù)據(jù)結(jié)構(gòu): 數(shù)組、鏈表、哈希表、跳表等。
- 是否有界: 有界、無界。
- 排序: 是否需要排序。
- 讀寫比例: 讀多寫少、寫多讀少、讀寫均衡。
- 性能要求: 對并發(fā)性能的要求。
問題分析:
這個問題考察了 Java 中線程安全集合的種類和用法。
與其他問題的知識點聯(lián)系:
- Java 線程安全的集合有哪些? 這是對 Java 并發(fā)集合的整體了解。
- Java 中的 synchronized 是怎么實現(xiàn)的?
Collections.synchronizedXXX方法使用了synchronized關(guān)鍵字。 - Java 中 ReentrantLock 的實現(xiàn)原理是什么? 一些并發(fā)集合(如
ArrayBlockingQueue)內(nèi)部使用了ReentrantLock。 - 什么是 Java 的 CAS(Compare-And-Swap)操作? 一些并發(fā)集合(如
ConcurrentHashMap)使用了 CAS 操作。 - 你使用過 Java 中的哪些阻塞隊列? 阻塞隊列是線程安全集合的重要組成部分。
理解這些聯(lián)系可以幫助你更全面地掌握 Java 并發(fā)編程的知識,并了解如何在實際應(yīng)用中選擇合適的線程安全集合。
到此這篇關(guān)于Java線程安全集合有哪些的文章就介紹到這了,更多相關(guān)Java線程安全的集合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java ThreadPoolExecutor使用方法簡單介紹
這篇文章主要介紹了java ThreadPoolExecutor使用方法簡單介紹的相關(guān)資料,需要的朋友可以參考下2017-02-02
Spring Cloud Gateway 使用JWT工具類做用戶登錄校驗功能
這篇文章主要介紹了Spring Cloud Gateway 使用JWT工具類做用戶登錄校驗的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Java中JDom解析XML_動力節(jié)點Java學(xué)院整理
JDOM是一種解析XML的Java工具包。DOM適合于當(dāng)今流行的各種語言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等。下面通過本文給大家介紹Java中JDom解析XML的方法,感興趣的朋友一起學(xué)習(xí)吧2017-07-07
Javaweb開發(fā)中通過Servlet生成驗證碼圖片
這篇文章主要為大家詳細(xì)介紹了Javaweb開發(fā)中通過Servlet生成驗證碼圖片的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05

