ConcurrentLinkedDeque 是 Java 7 引入的非阻塞線程安全雙端佇列,基於 CAS(Compare-And-Swap)無鎖演算法實現,適合高併發場景下多執行緒共享存取集合。
ConcurrentModificationExceptionNullPointerException| 操作類型 | 方法 | 行為 |
|---|---|---|
| 插入 | add(e) / addLast(e) | 尾端插入,成功回傳 true |
| addFirst(e) | 頭端插入 | |
| 移除並回傳 | pollFirst() / pollLast() | 空佇列回傳 null |
| removeFirst() / removeLast() | 空佇列拋出 NoSuchElementException | |
| pop() | 等同 removeFirst() | |
| 查看不移除 | peekFirst() / peekLast() | 空佇列回傳 null |
| getFirst() / getLast() | 空佇列拋出 NoSuchElementException | |
| peek() | 等同 peekFirst() |
import java.util.concurrent.ConcurrentLinkedDeque;
public class AddTask implements Runnable {
private final ConcurrentLinkedDeque deque;
public AddTask(ConcurrentLinkedDeque deque) {
this.deque = deque;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
for (int i = 0; i < 10000; i++) {
deque.add(name + ": Element " + i); // 尾端插入
}
}
}
public class RemoveTask implements Runnable {
private final ConcurrentLinkedDeque deque;
public RemoveTask(ConcurrentLinkedDeque deque) {
this.deque = deque;
}
@Override
public void run() {
for (int i = 0; i < 5000; i++) {
deque.pollFirst(); // 頭端移除
deque.pollLast(); // 尾端移除
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
ConcurrentLinkedDeque deque = new ConcurrentLinkedDeque<>();
Thread[] threads = new Thread[100];
// 啟動 100 個生產者執行緒
for (int i = 0; i < 100; i++) {
threads[i] = new Thread(new AddTask(deque));
threads[i].start();
}
System.out.printf("Main: %d AddTask threads launched\n", threads.length);
// 等待所有生產者完成
for (Thread t : threads) t.join();
System.out.printf("Main: Deque size after add: %d\n", deque.size()); // 1,000,000
// 啟動 100 個消費者執行緒
for (int i = 0; i < 100; i++) {
threads[i] = new Thread(new RemoveTask(deque));
threads[i].start();
}
System.out.printf("Main: %d RemoveTask threads launched\n", threads.length);
for (Thread t : threads) t.join();
System.out.printf("Main: Deque size after remove: %d\n", deque.size()); // 0
}
}
Main: 100 AddTask threads launched Main: Deque size after add: 1000000 Main: 100 RemoveTask threads launched Main: Deque size after remove: 0
LinkedBlockingDeque;單端佇列用 ConcurrentLinkedQueue