java中l(wèi)ist實(shí)現(xiàn)類和queue實(shí)現(xiàn)類的區(qū)別說明

list實(shí)現(xiàn)類說明

        // hashMap特點(diǎn)是數(shù)組+鏈表擒权,當(dāng)鏈表長度=8的時(shí)候,鏈表會(huì)拓展成紅黑樹
        // 數(shù)組長度為2的倍數(shù)锨亏,默認(rèn)長度是16备籽,加載因子是0.75
        Map<String, String> map2 = new HashMap<>();

        // concurrentmap特點(diǎn)是數(shù)組+鏈表怒见,當(dāng)鏈表長度=8的時(shí)候,會(huì)拓展成紅黑樹;并發(fā)的時(shí)候并非全局上鎖兔沃,
        //而是鎖鏈表的頭結(jié)點(diǎn)橄碾,使用synchronized
        // 數(shù)組長度為2的倍數(shù)
        Map<String, String> map = new ConcurrentHashMap<>(10);

        // 存儲(chǔ)方式是數(shù)組卵沉、通過modcount判斷是否被修改、
        //擴(kuò)容方式是system.arraycory法牲,每次擴(kuò)容是上一次的1.5倍
        List<String> list = new ArrayList<String>();

        // 鏈表結(jié)構(gòu)史汗,查詢時(shí)候會(huì)判斷index在上半截還是下半截,如果是下半截拒垃,那就從尾部開始往前查找
        // 雖然繼承deque停撞,但是不是雙向鏈表結(jié)構(gòu)
        // 也是通過modcount來判斷是否被修改過
        List<String> linklist = new LinkedList<>();

        // 并發(fā)鏈表,鏈表結(jié)構(gòu)悼瓮,通過for+cas的方式更新節(jié)點(diǎn)戈毒。size的長度是通過遍歷鏈表得來的。
        // 新增節(jié)點(diǎn)的時(shí)候横堡,先修改tail節(jié)點(diǎn)的next埋市,然后判斷tail != next的時(shí)候才更新tail命贴,(延遲更新恐疲,提升效率)
        // 所以1.tail并不是真正意義上面的最后節(jié)點(diǎn) 2.分開更新提供了效率,
        //因?yàn)椴l(fā)情況下更新tail的次數(shù)更小了腊满。這里使用的是weakCompareAndSet(可能原子性更新)
        ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();

queue實(shí)現(xiàn)類說明

    // 數(shù)組結(jié)構(gòu)的有界阻塞隊(duì)列,線程安全類
    // 使用reentrantlock實(shí)現(xiàn)全局方法加鎖,只有一把鎖
    // 和兩個(gè)condition實(shí)現(xiàn)put和task的阻塞,可以使用公平和非公平鎖培己,默認(rèn)是非公平
    BlockingQueue blockQueue = new ArrayBlockingQueue<String>(10);

    // 鏈表結(jié)構(gòu)的有界阻塞隊(duì)列
    // 使用兩把reentrantlock鎖碳蛋,一把put鎖,一把task鎖省咨。
    // 所有寫入方法都要先獲取put鎖肃弟,所有刪除數(shù)據(jù)都要先獲取task鎖。
    // 隊(duì)列的元素個(gè)數(shù)使用atmoicinteger記錄零蓉,
    //寫入的時(shí)候判斷元素個(gè)數(shù)是否等于隊(duì)列容量笤受,是的則使用put鎖的condition.await阻塞方法,
    // 寫入成功之后判斷當(dāng)前隊(duì)列元素個(gè)數(shù)+1小于容量就喚醒一個(gè)鎖

    // 所有獲取元素都要先獲取task鎖,然后判斷當(dāng)前隊(duì)列容量等于0則是使用task鎖的condition.await阻塞線程
    // 成功獲取元素之后敌蜂,判斷當(dāng)前隊(duì)列元素個(gè)數(shù)是否大于1箩兽,大于則喚醒一個(gè)線程

    // 使用atomicinteger原子性更新隊(duì)列元素個(gè)數(shù)
    // remove,contains,toArray,clear,獲取iterator(next方法)等都要先獲取put和task鎖
    blockQueue = new LinkedBlockingQueue<String>(10);

    // 一個(gè)支持優(yōu)先級排序的無界隊(duì)列
    // 數(shù)組方式存儲(chǔ),默認(rèn)長度是8章喉,最大嘗試是integer.max_value - 8
    // 一把reentrantlock鎖汗贫,針對所有publie方法
    // 回頭來看priorityqueue隊(duì)列吧
    // PriorityBlockingQueue是一個(gè)無界隊(duì)列,擴(kuò)容方式是容量小于64的時(shí)候秸脱,
    // 擴(kuò)容每次+2落包,超過64的時(shí)候,每次擴(kuò)容1.5倍
    // 當(dāng)容量滿的時(shí)候摊唇,put沒有阻塞咐蝇,而是擴(kuò)容
    // 當(dāng)容量等于=0的時(shí)候,task會(huì)阻塞巷查。
    blockQueue = new PriorityBlockingQueue<String>();

    // 一個(gè)使用優(yōu)先級隊(duì)列實(shí)現(xiàn)的延遲無界隊(duì)列
    // 使用reentrantlock一把鎖
    // 寫入的對象需要實(shí)現(xiàn)Delayed接口類有序,也是使用priorityqueue隊(duì)列
    // 寫入的時(shí)候,包括put都使用offer方法岛请,不阻塞寫入
    // 讀取的時(shí)候task會(huì)阻塞旭寿,結(jié)合priorityqueue和獲取第一個(gè)元素,
    // 判斷時(shí)間是否大于等于設(shè)置的運(yùn)行時(shí)間髓需,如果是則返回,否則阻塞線程
    blockQueue = new DelayQueue<MyDelay>();

    // 一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列
    // 內(nèi)部使用公平和非公平傳輸方式房蝉,公平就是先進(jìn)先出僚匆,非公平就是后進(jìn)先出
    // 使用for循環(huán)+cas的方式,寫入數(shù)據(jù)搭幻。查詢數(shù)據(jù)一樣咧擂,其實(shí)他們都是使用同一個(gè)底層方法,for+cas對head的寫入檀蹋。寫入是寫入具體snode值松申,讀取是寫入null值
    blockQueue = new SynchronousQueue<String>();

    // 一個(gè)由鏈表結(jié)構(gòu)組成的無界隊(duì)列
    // for+cas方式寫入
    // 多了tryTransfer和transfer方法云芦,如果當(dāng)前有消費(fèi)者正在等待接受元素,transfer則把生產(chǎn)者傳入的元素立即給消費(fèi)者贸桶。
    // 如果沒有消費(fèi)在等待元素舅逸,transfer會(huì)把元素放入tail節(jié)點(diǎn),并等待該元素被消費(fèi)才返回皇筛。
    // tryTransfer是無論消費(fèi)者是否接受琉历,立刻返回
    // 這里面的說明好像不對
    blockQueue = new LinkedTransferQueue<String>();

    // 一個(gè)由鏈表組成的雙向阻塞隊(duì)列
    // 一把reentrantlock鎖,兩個(gè)condition水醋,最大長度為integer.max_value
    blockQueue = new LinkedBlockingDeque<String>();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旗笔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拄踪,更是在濱河造成了極大的恐慌蝇恶,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惶桐,死亡現(xiàn)場離奇詭異撮弧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)耀盗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門想虎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叛拷,你說我怎么就攤上這事舌厨。” “怎么了忿薇?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵裙椭,是天一觀的道長。 經(jīng)常有香客問我署浩,道長揉燃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任筋栋,我火速辦了婚禮炊汤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弊攘。我一直安慰自己抢腐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布襟交。 她就那樣靜靜地躺著迈倍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捣域。 梳的紋絲不亂的頭發(fā)上啼染,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天宴合,我揣著相機(jī)與錄音,去河邊找鬼迹鹅。 笑死卦洽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的徒欣。 我是一名探鬼主播逐样,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼打肝!你這毒婦竟也來了脂新?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤粗梭,失蹤者是張志新(化名)和其女友劉穎争便,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體断医,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滞乙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鉴嗤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斩启。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖醉锅,靈堂內(nèi)的尸體忽然破棺而出兔簇,到底是詐尸還是另有隱情,我是刑警寧澤硬耍,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布垄琐,位于F島的核電站,受9級特大地震影響经柴,放射性物質(zhì)發(fā)生泄漏狸窘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一坯认、第九天 我趴在偏房一處隱蔽的房頂上張望翻擒。 院中可真熱鬧,春花似錦牛哺、人聲如沸陋气。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恩伺。三九已至赴背,卻和暖如春椰拒,著一層夾襖步出監(jiān)牢的瞬間晶渠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工燃观, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褒脯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓缆毁,卻偏偏與公主長得像番川,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子脊框,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容