成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

當 LinkedList 不是列表時,速度快的兔子都追不上!

開發 前端
Deque是xjjdog最喜歡的一個接口。每當使用offerFirst、offerLast這樣精準的API進行操作,都會體驗到多巴胺的樂趣。LinkedList作為它的兒子,自然擁有了這些所有的功能。

ArrayList和LinkedList有什么區別?

這種侮辱人的問題,默認就把這兩者限定在了同一個場景之中,它甚至連八股文都算不上。

一旦你被問到這種問題,也證明面試基本上泡湯了--面試官已經實在是找不到其他問題與你交流了。

你Over了。

但當我們細看一下LinkedList的class定義,就會發現,它并不像是ArrayList的那樣具有純潔的列表精神。

public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable

//VS

public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable

LinkedList除了能夠當作普通的列表,它還是一個Deque。雙向鏈表,聽著就比較唬人,這就是一個既能當做隊列、又能當做棧的存在。

有了這種雙重Buff的疊加,LinkedList的應用場景比ArrayList豐富的多。除了能做最簡單的LRU緩存,LinkedList在刷題的時候也是充滿了正能量。

關于類似Deque的API,xjjdog以前有專門的文章來介紹這些爆炸性的方法。

王者ConcurrentLinkedQueue,一個阻塞的雙向隊列,它的基本操作方法有:(3[基本]x2[異常與返回值]+4[阻塞加超時])x3[隊頭隊尾]=5x2x3=30,足足有30個方法。看完上面的文章,這30個方法可以很快手到擒來。

不過我們今天要聊的一個重點,是使用Deque來實現更快的延遲隊列。

延遲隊列

如果你想要某些數據延遲一段時間再進行處理,或者要再某段時間內按照分組進行一些計算,那延遲隊列無疑是非常合適的。

在Java的Concurrent包里,就靜悄悄的躺著DelayQueue。只要你的數據實現了Delayed接口,那么就可以放心大膽的把它們往里面塞。

可惜的是,DelayQueue的底層存儲,使用的是PriorityQueue。

PriorityQueue是堆實現的,offer和poll數據的時間復雜度是O(logN)。這就意味著,當DelayQueue中的數據比較多的時候,它的性能就會下降。

除了把數據分片,使用多個DelayQueue來完成工作,我們有沒有速度更快的方法?比如把PriorityQueue使用LinkedList來替換?

這要看場景。

如果你向DelayQueue中添加數據,是與當前添加的時間相關的,那完全可以使用LinkedList來替換PriorityQueue。

關鍵代碼

要了解DelayQueue的運行原理,我們可以需要先看一下Delayed接口。任何想要存儲到DelayQueue中的數據,都需要實現這個接口。

其中,getDelay就是用來判斷當前數據是否超時的方法。而compareTo,則是PriorityQueue用來排序的,如果我們是按照當前塞入數據的,則compareTo方法就不是必要的。

按照以上的思路,我們把DelayQueue的代碼拷貝一份,僅保留關鍵代碼,如下。

public long getDelay(@NotNull TimeUnit unit) {
return MAX_CACHE_DUAL + this.enqueueTimeNs - System.nanoTime();
}
public int compareTo(@NotNull Delayed o) {
long d = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);
return (d == 0) ? 0 : (d < 0 ? -1 : 1);
}

主要方法

輕量級的延遲隊列,如果一旦采用了LinkedList,那么它的入隊、出隊方法,就都變成了O(1)的時間復雜度。在延遲隊列中的數據增加時,時間復雜度也能維持不變,可以說是速度快的連兔子都追不上了。

一般,在java中,put和take方法,都是代表阻塞性方法。比如,take方法,我們可以將其安全的阻塞在某個線程上,而不用擔心太多的資源浪費。

final Thread thread = Thread.currentThread();
while (!this.close && !thread.isInterrupted()) {
Data data = q.take();
}

這一切都是Condition辦到的,它和wait、notify的作用是一樣的。

當我們通過put方法添加新的數據到隊列中,會通過signal方法,來通知等待的線程獲取數據。

相同的,如果take方法發現隊列中的數據為空,它將進入等待狀態。如果有數據,也并不是馬上把這些數據取出來,因為數據還沒到期。比如最老的數據還剩下5秒才到期,代碼也對這種情況進行了處理,它會嘗試awaitNanos對應的時間。

這樣,我們就可以使用這種簡單的輪詢方式來實現延遲隊列,而不需要單獨的線程去檢測隊列中的數據。

增加take方法的效率

但是這樣還不夠。

當數據量比較大的時候,隊列的數據可能有多條已經到期。如果我們通過take方法來一條一條獲取的話,效率自然不如批量獲取高。

drainTo方法,可以一股腦的把到期的數據轉移到其他的集合中,但它并不是一個阻塞性的方法。

我們可以先使用take來阻塞線程,然后再批量取出所有數據。

下面代碼,會一次性獲取100條數據作為一個批量。

final Data takeItem = q.take();
final List<Data> buckets = new ArrayList<>(100);
q.drainTo(buckets, 99);
buckets.add(takeItem);

End

實際上,我們的某個業務,當采用LinkedList來替代PriorityQueue,并進行批量操作后,CPU的使用直接降低了1/3。

Deque是xjjdog最喜歡的一個接口。每當使用offerFirst、offerLast這樣精準的API進行操作,都會體驗到多巴胺的樂趣。LinkedList作為它的兒子,自然擁有了這些所有的功能。

當我們使用concurrent包里的基本API,對這些淳樸的工具進行封裝,它們就會煥發出新的活力。

作者簡介:小姐姐味道  (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高并發世界,給你不一樣的味道。

責任編輯:武曉燕 來源: 小姐姐味道
相關推薦

2022-12-15 18:20:46

ClickHouse存儲引擎

2018-11-12 12:02:54

SSD硬盤最快

2018-09-18 14:43:30

HBase查詢數據

2023-12-18 16:40:23

OxlintJavaScripRust

2024-10-30 09:42:43

固態硬盤SSD閃存

2010-04-27 09:34:21

2020-12-02 06:13:29

Redis連接池

2011-11-29 16:33:29

惠普激光打印機

2012-04-19 15:17:52

方正掃描儀

2012-05-24 16:07:17

惠普激光打印機

2021-01-04 09:58:46

5G6G運營商

2011-05-07 10:26:20

激光打印機

2012-02-06 15:47:09

惠普激光打印機

2011-12-14 15:25:33

惠普激光打印機

2012-03-12 11:48:44

惠普激光打印機

2018-02-08 09:07:19

Opera 瀏覽器火狐

2011-08-10 17:46:17

松下傳真機

2012-06-20 13:17:29

惠普激光打印機

2011-05-18 17:21:36

松下傳真機

2015-05-08 09:41:18

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产98色在线 | 日韩 | 国产免费一区二区 | 国产成人免费 | 国产成人一区二区三区 | 久久久久久久久99 | 天天爽一爽| 精品一区在线 | 国产高清在线观看 | 国产高清一二三区 | 国产欧美一区二区精品久导航 | 国产日韩欧美一区二区 | 波多野结衣在线观看一区二区三区 | 成人在线视 | 色毛片 | av在线免费观看网站 | 亚洲国产中文字幕 | 亚洲欧洲在线观看视频 | 黄色av一区 | 欧美福利三区 | 男女视频在线观看网站 | 亚洲欧美精| 亚洲男女激情 | 91天堂 | 日日摸夜夜添夜夜添精品视频 | 国产成人精品一区二区 | 亚洲乱码国产乱码精品精的特点 | 久久久入口 | 日韩精品一二三 | 欧美乱大交xxxxx另类电影 | 久久99这里只有精品 | 欧美自拍一区 | 久久天堂 | 国产 欧美 日韩 一区 | 亚洲性视频 | 亚洲 欧美 精品 | 亚洲精品中文字幕中文字幕 | 亚洲免费大片 | 国产目拍亚洲精品99久久精品 | 麻豆av免费观看 | 久久精品天堂 | 亚洲一区二区三区四区av |