ArrayBlockingQueue和LinkedBlockingQueue的區別

  1. 隊列中鎖的實現不同
    ArrayBlockingQueue實現的隊列中的鎖是沒有分離的,即生產和消費用的是同一個鎖;
    LinkedBlockingQueue實現的隊列中的鎖是分離的,即生產用的是putLock,消費是takeLock

  2. 在生產或消費時操作不同
    ArrayBlockingQueue實現的隊列中在生產和消費的時候,是直接將枚舉對象插入或移除的;
    LinkedBlockingQueue實現的隊列中在生產和消費的時候,需要把枚舉對象轉換爲Node進行插入或移除,會影響性能

  3. 隊列大小初始化方式不同
    ArrayBlockingQueue實現的隊列中必須指定隊列的大小;
    LinkedBlockingQueue實現的隊列中可以不指定隊列的大小,但是默認是Integer.MAX_VALUE

注意:
1. 在使用LinkedBlockingQueue時,若用默認大小且當生產速度大於消費速度時候,有可能會內存溢出
2. 在使用ArrayBlockingQueue和LinkedBlockingQueue分別對1000000個簡單字符做入隊操作時,
LinkedBlockingQueue的消耗是ArrayBlockingQueue消耗的10倍左右,
即LinkedBlockingQueue消耗在1500毫秒左右,而ArrayBlockingQueue只需150毫秒左右。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章