Java中一些常見的并發(fā)集合類的使用
什么是并發(fā)集合?
列舉一些常見的并發(fā)集合類
并發(fā)集合是一種特殊的數(shù)據(jù)結(jié)構(gòu),它允許多個(gè)線程安全地訪問和修改。在多線程編程的場(chǎng)景下,只有使用并發(fā)集合才能確保線程安全,避免多個(gè)線程在對(duì)同一個(gè)數(shù)據(jù)結(jié)構(gòu)進(jìn)行并發(fā)操作時(shí)引發(fā)的競(jìng)態(tài)條件和其他并發(fā)錯(cuò)誤。
常見的并發(fā)集合類包括:
- ArrayBlockingQueue:一個(gè)基于數(shù)組實(shí)現(xiàn)的阻塞隊(duì)列,創(chuàng)建對(duì)象時(shí)必須指定容量。
- ConcurrentLinkedQueue:一個(gè)線程安全的、基于鏈接節(jié)點(diǎn)的、可選容量的無界非阻塞隊(duì)列。
- LinkedBlockingQueue:一個(gè)基于鏈表的阻塞隊(duì)列,此隊(duì)列按 FIFO(先進(jìn)先出)排序元素。
- PriorityBlockingQueue:一個(gè)支持優(yōu)先級(jí)堆的無界阻塞隊(duì)列。
- DelayQueue:一個(gè)支持延時(shí)獲取元素的無界阻塞隊(duì)列。
- SynchronousQueue:一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列,每個(gè)插入操作必須等待一個(gè)相應(yīng)的刪除操作,反之亦然。
- LinkedBlockingDeque:一個(gè)由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列。
- CopyOnWriteArrayList:一個(gè)線程安全的可變數(shù)組,其中所有可變操作(add、set 等等)都是通過對(duì)底層數(shù)組的復(fù)制來實(shí)現(xiàn)的。
- CopyOnWriteArraySet:一個(gè)線程安全的 Set 實(shí)現(xiàn),基于 CopyOnWriteArrayList。
這些并發(fā)集合類提供了線程安全的集合操作,使得在多線程環(huán)境下可以安全地共享和修改數(shù)據(jù)。
并發(fā)集合的使用示例
以下是一個(gè)使用 ConcurrentLinkedDeque 的簡(jiǎn)單示例,該示例展示了如何在多線程環(huán)境下安全地添加和刪除元素:
import java.util.concurrent.ConcurrentLinkedDeque;
public class ConcurrentCollectionExample {
public static void main(String[] args) throws InterruptedException {
// 創(chuàng)建一個(gè)并發(fā)雙端隊(duì)列
ConcurrentLinkedDeque<String> deque = new ConcurrentLinkedDeque<>();
// 增加任務(wù)類,用于向隊(duì)列中添加數(shù)據(jù)
class AddTask implements Runnable {
private ConcurrentLinkedDeque<String> deque;
public AddTask(ConcurrentLinkedDeque<String> deque) {
this.deque = deque;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
for (int i = 0; i < 1000; i++) {
deque.add(name + ":" + i);
}
}
}
// 刪除任務(wù)類,用于從隊(duì)列中刪除數(shù)據(jù)
class PollTask implements Runnable {
private ConcurrentLinkedDeque<String> deque;
public PollTask(ConcurrentLinkedDeque<String> deque) {
this.deque = deque;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
while (!deque.isEmpty()) {
System.out.println(name + " removed: " + deque.poll());
}
}
}
// 創(chuàng)建并啟動(dòng)添加數(shù)據(jù)的線程
Thread addThread1 = new Thread(new AddTask(deque), "AddThread1");
Thread addThread2 = new Thread(new AddTask(deque), "AddThread2");
addThread1.start();
addThread2.start();
// 等待添加數(shù)據(jù)的線程完成
addThread1.join();
addThread2.join();
// 創(chuàng)建并啟動(dòng)刪除數(shù)據(jù)的線程
Thread pollThread = new Thread(new PollTask(deque), "PollThread");
pollThread.start();
// 等待刪除數(shù)據(jù)的線程完成
pollThread.join();
System.out.println("Deque is now empty.");
}
}
在這個(gè)示例中,我們創(chuàng)建了一個(gè) ConcurrentLinkedDeque,它是一個(gè)線程安全的雙端隊(duì)列。我們定義了兩個(gè)任務(wù)類,AddTask 和 PollTask,分別用于向隊(duì)列中添加數(shù)據(jù)和從隊(duì)列中刪除數(shù)據(jù)。這兩個(gè)任務(wù)類都實(shí)現(xiàn)了 Runnable 接口,因此它們可以被線程執(zhí)行。
在 main 方法中,我們創(chuàng)建了兩個(gè)添加數(shù)據(jù)的線程和一個(gè)刪除數(shù)據(jù)的線程。這兩個(gè)添加數(shù)據(jù)的線程將向隊(duì)列中添加數(shù)據(jù),而刪除數(shù)據(jù)的線程將從隊(duì)列中刪除數(shù)據(jù),直到隊(duì)列為空。
通過使用 ConcurrentLinkedDeque,我們可以在多線程環(huán)境下安全地進(jìn)行添加和刪除操作,而不需要額外的同步或鎖定。這是并發(fā)集合的主要優(yōu)勢(shì)之一。
到此這篇關(guān)于Java中一些常見的并發(fā)集合類的使用的文章就介紹到這了,更多相關(guān)Java 并發(fā)集合類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
百度翻譯API使用詳細(xì)教程(前端vue+后端springboot)
這篇文章主要給大家介紹了關(guān)于百度翻譯API使用的相關(guān)資料,百度翻譯API是百度面向開發(fā)者推出的免費(fèi)翻譯服務(wù)開放接口,任何第三方應(yīng)用或網(wǎng)站都可以通過使用百度翻譯API為用戶提供實(shí)時(shí)優(yōu)質(zhì)的多語(yǔ)言翻譯服務(wù),需要的朋友可以參考下2024-02-02
SSH框架網(wǎng)上商城項(xiàng)目第10戰(zhàn)之搭建商品類基本模塊
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第10戰(zhàn)之搭建商品類基本模塊的相關(guān)資料,有一定的實(shí)用性,感興趣的小伙伴們可以參考一下2016-06-06
druid ParserException類錯(cuò)誤問題及解決
這篇文章主要介紹了druid ParserException類錯(cuò)誤問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
java中struts2實(shí)現(xiàn)文件上傳下載功能
這篇文章主要介紹了java中struts2實(shí)現(xiàn)文件上傳下載功能的方法,以實(shí)例形式分析了struts2文件上傳下載功能的實(shí)現(xiàn)技巧與相關(guān)問題,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05
Spring Boot 中application.yml與bootstrap.yml的區(qū)別
其實(shí)yml和properties文件是一樣的原理,且一個(gè)項(xiàng)目上要么yml或者properties,二選一的存在。這篇文章給大家介紹了Spring Boot 中application.yml與bootstrap.yml的區(qū)別,感興趣的朋友一起看看吧2018-04-04

