日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

非阻塞线程安全列表——ConcurrentLinkedDeque应用举例

發(fā)布時間:2023/12/3 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 非阻塞线程安全列表——ConcurrentLinkedDeque应用举例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自??非阻塞線程安全列表——ConcurrentLinkedDeque應(yīng)用舉例

?

?在java中,最常用的數(shù)據(jù)結(jié)構(gòu)可能是列表。有數(shù)目不詳?shù)脑亓斜?你可以添加、閱讀、或刪除任何位置的元素。此外,并發(fā)列表允許不同的線程列表中添加或刪除元素時不產(chǎn)生任何數(shù)據(jù)不一致。非阻塞列表提供如下操作,如果操作不能立即完成,列出拋出異常或者返回一個null值。Java 7中引入了ConcurrentLinkedDeque類,它實(shí)現(xiàn)了一個非阻塞并發(fā)列表,在本教程中,我們將學(xué)習(xí)使用這個類。

?

???????在這個例子中,我們將實(shí)現(xiàn)一個示例使用以下兩個不同的任務(wù):

?????? 一個將大量數(shù)據(jù)添加到一個列表中
?????? 一個大量地從同樣的列表中刪除數(shù)據(jù)
????? 讓我們?yōu)槊總€任務(wù)創(chuàng)建的線程:

package com.howtodoinjava.demo.multithreading.concurrentLinkedDequeExample; import java.util.concurrent.ConcurrentLinkedDeque; public class AddTask implements Runnable { private ConcurrentLinkedDeque<String> list; public AddTask(ConcurrentLinkedDeque<String> list) { this.list = list; } @Override public void run() { String name = Thread.currentThread().getName(); for (int i = 0; i < 10000; i++) { list.add(name + ": Element " + i); } } }

和:

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個線程將數(shù)據(jù)添加到列表和100個線程從列表刪除數(shù)據(jù)。如果真的是線程安全的和非阻塞,它會幾乎立即給你最終結(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??

?

?

讓我們看看它如何工作:

  • 首先,你執(zhí)行100個?AddTask任務(wù)將元素添加到任務(wù)列表。每一個任務(wù)使用?add()方法插入10000個元素到列表,新增加的元素都會放到列表最后。當(dāng)所有這些任務(wù)已經(jīng)完成了,你會在控制臺打印出了列表的元素?cái)?shù)量。這時,這個列表有1000000個元素。
  • 然后,你執(zhí)行100個?RemoveTask任務(wù)將元素從列表中刪除。每一個任務(wù)刪除這個列表?用pollFirst()和pollLast()方法。pollFirst()方法返回和刪除列表的第一個元素和pollLast()方法返回和刪除最后一個元素的列表。如果列表為空,這些方法返回一個null值。當(dāng)所有這些任務(wù)已經(jīng)完成了,在控制臺的打印出列表中元素的數(shù)量,這時,有零元素列表。
  • 打印列表的元素的數(shù)量時,你使用了?size()方法,你必須考慮,這種方法并不是真實(shí)的,特別是如果你使用它在線程進(jìn)行列表中添加同時又刪除數(shù)據(jù)。計(jì)數(shù)的方法遍歷整個列表的元素和內(nèi)容列表可以改變這個操作。一旦在你使用它們時沒有任何線程修改列表,你可以保證返回的結(jié)果是正確的。
  • 請注意,?ConcurrentLinkedDeque類提供了更多的方法來獲取元素列表形式:

    • getFirst()和?getLast():這些方法返回分別從列表中第一個和最后一個元素。他們不會從列表中刪除返回的元素。如果列表是空的,這些方法拋出一個?NoSuchElementExcpetion例外。
    • peek(),?peekFirst(),?peekLast():這些方法返回列表的第一個和最后一個元素。他們不會從列表中刪除返回的元素。如果列表為空,這些方法返回一個null值。
    • remove(),?removeFirst(),?removeLast():這些方法返回列表的第一個和最后一個元素。他們從列表中移除返回的元素。如果列表是空的,這些方法拋出一個?NoSuchElementException例外。
    • 一個?ConcurrentLinkedDeque是一個合適的選擇,許多線程共享訪問公共集合。
    • 像大多數(shù)其他并發(fā)集合實(shí)現(xiàn),這個類不允許null元素的使用。
    • 迭代器是弱一致的,返回元素反映在一些點(diǎn)或雙端隊(duì)列的狀態(tài),因?yàn)榈鞯膭?chuàng)建。他們不把ConcurrentModificationException與其他操作,可以同時進(jìn)行。

    ?

    ?

    ?

    總結(jié)

    以上是生活随笔為你收集整理的非阻塞线程安全列表——ConcurrentLinkedDeque应用举例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。