摘要:序是一個(gè)基于鏈接節(jié)點(diǎn)的無界線程安全隊(duì)列,它采用先進(jìn)先出的規(guī)則對(duì)節(jié)點(diǎn)進(jìn)行排序,當(dāng)我們添加一個(gè)元素的時(shí)候,它會(huì)添加到隊(duì)列的尾部,當(dāng)我們獲取一個(gè)元素時(shí),它會(huì)返回隊(duì)列頭部的元素。的模型,默認(rèn)的是用這個(gè)來實(shí)現(xiàn)的。
序
ConcurrentLinkedQueue是一個(gè)基于鏈接節(jié)點(diǎn)的無界線程安全隊(duì)列,它采用先進(jìn)先出的規(guī)則對(duì)節(jié)點(diǎn)進(jìn)行排序,當(dāng)我們添加一個(gè)元素的時(shí)候,它會(huì)添加到隊(duì)列的尾部,當(dāng)我們獲取一個(gè)元素時(shí),它會(huì)返回隊(duì)列頭部的元素。
對(duì)比queue | 阻塞與否 | 是否有界 | 線程安全保障 | 適用場(chǎng)景 | 注意事項(xiàng) |
---|---|---|---|---|---|
ArrayBlockingQueue | 阻塞 | 有界 | 一把全局鎖 | 生產(chǎn)消費(fèi)模型,平衡兩邊處理速度 | -- |
LinkedBlockingQueue | 阻塞 | 可配置 | 存取采用2把鎖 | 生產(chǎn)消費(fèi)模型,平衡兩邊處理速度 | 無界的時(shí)候注意內(nèi)存溢出問題 |
ConcurrentLinkedQueue | 非阻塞 | 無界 | CAS | 對(duì)全局的集合進(jìn)行操作的場(chǎng)景 | size() 是要遍歷一遍集合,慎用 |
由于ConcurrentLinkedQueue是無界的,所以使用的時(shí)候要特別注意內(nèi)存溢出問題。akka的actor模型,默認(rèn)的mailbox是用這個(gè)來實(shí)現(xiàn)的。
object UnboundedMailbox { class MessageQueue extends ConcurrentLinkedQueue[Envelope] with UnboundedQueueBasedMessageQueue { final def queue: Queue[Envelope] = this } }
MyUnboundedMailbox
public class MyUnboundedMailbox implements MailboxType, ProducesMessageQueuedoc{ // This is the MessageQueue implementation public static class MyMessageQueue implements MessageQueue, MyUnboundedMessageQueueSemantics { private final Queue queue = new ConcurrentLinkedQueue (); // these must be implemented; queue used as example public void enqueue(ActorRef receiver, Envelope handle) { queue.offer(handle); } public Envelope dequeue() { return queue.poll(); } public int numberOfMessages() { return queue.size(); } public boolean hasMessages() { return !queue.isEmpty(); } public void cleanUp(ActorRef owner, MessageQueue deadLetters) { for (Envelope handle: queue) { deadLetters.enqueue(owner, handle); } } } // This constructor signature must exist, it will be called by Akka public MyUnboundedMailbox(ActorSystem.Settings settings, Config config) { // put your initialization code here } // The create method is called to create the MessageQueue public MessageQueue create(Option owner, Option system) { return new MyMessageQueue(); } }
Actors and Green Threads in Java Demystified
Mailboxes
Mailbox.scala
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76302.html
摘要:序是一個(gè)基于鏈接節(jié)點(diǎn)的無界線程安全隊(duì)列,它采用先進(jìn)先出的規(guī)則對(duì)節(jié)點(diǎn)進(jìn)行排序,當(dāng)我們添加一個(gè)元素的時(shí)候,它會(huì)添加到隊(duì)列的尾部,當(dāng)我們獲取一個(gè)元素時(shí),它會(huì)返回隊(duì)列頭部的元素。的模型,默認(rèn)的是用這個(gè)來實(shí)現(xiàn)的。 序 ConcurrentLinkedQueue是一個(gè)基于鏈接節(jié)點(diǎn)的無界線程安全隊(duì)列,它采用先進(jìn)先出的規(guī)則對(duì)節(jié)點(diǎn)進(jìn)行排序,當(dāng)我們添加一個(gè)元素的時(shí)候,它會(huì)添加到隊(duì)列的尾部,當(dāng)我們獲取一個(gè)元...
摘要:所以,在并發(fā)量適中的情況下,一般具有較好的性能。字段指向隊(duì)列頭,指向隊(duì)列尾,通過來操作字段值以及對(duì)象的字段值。單線程的情況下,元素入隊(duì)比較好理解,直接線性地在隊(duì)首插入元素即可。 showImg(https://segmentfault.com/img/bVbguGd?w=1200&h=800); 本文首發(fā)于一世流云專欄:https://segmentfault.com/blog... ...
摘要:注意這里指的不是當(dāng)次而是之后,所以如果我們使用隊(duì)列的方法返回,就知道隊(duì)列是否為空,但是不知道之后是否為空,并且,當(dāng)關(guān)注的操作發(fā)生時(shí),在插入或取出操作的返回值里告知此信息,來指導(dǎo)是否繼續(xù)注冊(cè)寫操作。 前言 本文寫給對(duì)ConcurrentLinkedQueue的實(shí)現(xiàn)和非阻塞同步算法的實(shí)現(xiàn)原理有一定了解,但缺少實(shí)踐經(jīng)驗(yàn)的朋友,文中包括了實(shí)戰(zhàn)中的嘗試、所走的彎路,經(jīng)驗(yàn)和教訓(xùn)。 背景介紹 ...
摘要:線程安全的線程安全的,在讀多寫少的場(chǎng)合性能非常好,遠(yuǎn)遠(yuǎn)好于高效的并發(fā)隊(duì)列,使用鏈表實(shí)現(xiàn)。這樣帶來的好處是在高并發(fā)的情況下,你會(huì)需要一個(gè)全局鎖來保證整個(gè)平衡樹的線程安全。 該文已加入開源項(xiàng)目:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識(shí)的文檔類項(xiàng)目,Star 數(shù)接近 14 k)。地址:https://github.com/Snailclimb... 一 JDK ...
摘要:不難看出,方法的內(nèi)部,必然是使用原子指令來完成的。它是一個(gè)內(nèi)部使用的專屬類。注意根據(jù)類加載器的工作原理,應(yīng)用程序的類由加載。加載器沒有對(duì)象的對(duì)象,因此試圖獲得這個(gè)類加載器會(huì)返回。 如果你對(duì)技術(shù)有著不折不撓的追求,應(yīng)該還會(huì)特別在意incrementAndGet() 方法中compareAndSet()的實(shí)現(xiàn)?,F(xiàn)在,就讓我們更進(jìn)一步看一下它把!public final boolean co...
閱讀 3466·2019-08-30 15:44
閱讀 807·2019-08-30 13:46
閱讀 2097·2019-08-30 11:05
閱讀 3344·2019-08-29 18:32
閱讀 2165·2019-08-29 13:56
閱讀 1303·2019-08-29 12:57
閱讀 770·2019-08-28 18:21
閱讀 1755·2019-08-26 12:16