非阻塞线程安全列表——ConcurrentLinkedDeque应用举例
轉(zhuǎn)載自??非阻塞線程安全列表——ConcurrentLinkedDeque應(yīng)用舉例
?
?在java中,最常用的數(shù)據(jù)結(jié)構(gòu)可能是列表。有數(shù)目不詳?shù)脑亓斜?你可以添加、閱讀、或刪除任何位置的元素。此外,并發(fā)列表允許不同的線程列表中添加或刪除元素時(shí)不產(chǎn)生任何數(shù)據(jù)不一致。非阻塞列表提供如下操作,如果操作不能立即完成,列出拋出異常或者返回一個(gè)null值。Java 7中引入了ConcurrentLinkedDeque類(lèi),它實(shí)現(xiàn)了一個(gè)非阻塞并發(fā)列表,在本教程中,我們將學(xué)習(xí)使用這個(gè)類(lèi)。
?
???????在這個(gè)例子中,我們將實(shí)現(xiàn)一個(gè)示例使用以下兩個(gè)不同的任務(wù):
?????? 一個(gè)將大量數(shù)據(jù)添加到一個(gè)列表中
?????? 一個(gè)大量地從同樣的列表中刪除數(shù)據(jù)
????? 讓我們?yōu)槊總€(gè)任務(wù)創(chuàng)建的線程:
和:
packagecom.howtodoinjava.demo.multithreading.concurrentLinkedDequeExample;importjava.util.concurrent.ConcurrentLinkedDeque;publicclass RemoveTask implementsRunnable {privateConcurrentLinkedDeque<String> list;publicRemoveTask(ConcurrentLinkedDeque<String> list) {this.list = list;}@Overridepublicvoid run() {for(inti = 0; i < 5000; i++) {list.pollFirst();list.pollLast();}} }?現(xiàn)在,讓我們創(chuàng)建100個(gè)線程將數(shù)據(jù)添加到列表和100個(gè)線程從列表刪除數(shù)據(jù)。如果真的是線程安全的和非阻塞,它會(huì)幾乎立即給你最終結(jié)果。此外,列表大小最終將是零。
package com.howtodoinjava.demo.multithreading.concurrentLinkedDequeExample; import java.util.concurrent.ConcurrentLinkedDeque; public class Main { public static void main(String[] args) { ConcurrentLinkedDeque<String> list = new ConcurrentLinkedDeque<>(); Thread threads[] = new Thread[100]; for (int i = 0; i < threads.length; i++) { AddTask task = new AddTask(list); threads[i] = new Thread(task); threads[i].start(); } System.out.printf("Main: %d AddTask threads have been launched\n", threads.length); for (int i = 0; i < threads.length; i++) { try { threads[i].join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.printf("Main: Size of the List: %d\n", list.size()); for (int i = 0; i < threads.length; i++) { RemoveTask task = new RemoveTask(list); threads[i] = new Thread(task); threads[i].start(); } System.out.printf("Main: %d RemoveTask threads have been launched\n", threads.length); for (int i = 0; i < threads.length; i++) { try { threads[i].join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.printf("Main: Size of the List: %d\n", list.size()); } }Output:??
Main: 100 AddTask threads have been launched??
Main: Size of the List: 1000000??
Main: 100 RemoveTask threads have been launched??
Main: Size of the List: 0??
?
?
讓我們看看它如何工作:
請(qǐng)注意,?ConcurrentLinkedDeque類(lèi)提供了更多的方法來(lái)獲取元素列表形式:
- getFirst()和?getLast():這些方法返回分別從列表中第一個(gè)和最后一個(gè)元素。他們不會(huì)從列表中刪除返回的元素。如果列表是空的,這些方法拋出一個(gè)?NoSuchElementExcpetion例外。
- peek(),?peekFirst(),?peekLast():這些方法返回列表的第一個(gè)和最后一個(gè)元素。他們不會(huì)從列表中刪除返回的元素。如果列表為空,這些方法返回一個(gè)null值。
- remove(),?removeFirst(),?removeLast():這些方法返回列表的第一個(gè)和最后一個(gè)元素。他們從列表中移除返回的元素。如果列表是空的,這些方法拋出一個(gè)?NoSuchElementException例外。
- 一個(gè)?ConcurrentLinkedDeque是一個(gè)合適的選擇,許多線程共享訪問(wèn)公共集合。
- 像大多數(shù)其他并發(fā)集合實(shí)現(xiàn),這個(gè)類(lèi)不允許null元素的使用。
- 迭代器是弱一致的,返回元素反映在一些點(diǎn)或雙端隊(duì)列的狀態(tài),因?yàn)榈鞯膭?chuàng)建。他們不把ConcurrentModificationException與其他操作,可以同時(shí)進(jìn)行。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的非阻塞线程安全列表——ConcurrentLinkedDeque应用举例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 魔兽的电脑配置要求(魔兽的电脑配置)
- 下一篇: 什么配置是好电脑的(什么配置是好电脑)