Concurrent

jdk1.5提供的一個針對高并發(fā)進行編程的包

阻塞式隊列 - BlockingQueue
遵循先進先出(FIFO)原則。阻塞式隊列本身使用的時候是需要指定界限。

ArrayBlockingQueue - 阻塞式順序隊列 - 底層基于數(shù)組來進行存儲,使用的時候需要指定一個容量,容量指定后不可改變 ----常用于生產(chǎn)-消費模型

    // 這個隊列在創(chuàng)建的時候需要指定容量,容量在指定之后不可變
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(5);

        // 添加隊列
        queue.add("a");
        queue.add("b");
        queue.add("c");
        queue.add("d");
        queue.add("e");

        // 如果隊列已滿,則拋出異常 - IllegalStateException
        // queue.add("a");
        // 返回值標記元素是否成功添加到隊列里面
        // 如果隊列已滿,則返回false
        // boolean b = queue.offer("b");
        // System.out.println(b);
        // 如果隊列已滿,會產(chǎn)生阻塞 --- 直到這個隊列中有元素被取出,才會放開阻塞
        // queue.put("c");

        // 定時阻塞
        // 在3s之內(nèi)如果有元素被取出,那么元素就會添加到隊列中
        // 如果3s之后隊列依然是滿的,那么返回false表示添加失敗
        boolean b = queue.offer("d", 3000, TimeUnit.MILLISECONDS);
        System.out.println(b);
        System.out.println(queue);
                ArrayBlockingQueue<String> queue2 = new ArrayBlockingQueue<>(5);

        // 隊列為空,拋出異常:NoSuchElementException
        // String str = queue2.remove();
        // 隊列為空,返回null
        // String str = queue2.poll();
        // 隊列為空,產(chǎn)生阻塞 - 直到有其他線程向隊列中添加元素,才會放開阻塞
        // String str = queue2.take();
        // 定時阻塞
        String str = queue2.poll(3, TimeUnit.SECONDS);
        System.out.println(str);

LinkedBlockingQueue - 阻塞式鏈式隊列 - 底層基于鏈表(節(jié)點來進行數(shù)據(jù)的存儲),在使用時可以指定初始容量,也可以不指定,如果指定了容量,就以指定的容量為準進行存儲,如果不指定容量,那么默認容量是Integer.MAX_VALUE=2^31-1,如果不指定容量,一般認為這個容量是無限的。

PriorityBlockingQueue - 具有優(yōu)先級的阻塞式隊列 - 如果不指定容量默認容量為11 。如果將元素一一取出(只限普通for循環(huán)),那么會對元素進行自然排序--要求存儲的對象所對應(yīng)得類必須實現(xiàn)Comparable,重寫ComparaTo方法指定排序規(guī)則

//  @Override
//  // 指定比較規(guī)則
//  // 如果返回值>0,那么this就要排到o的后邊
//  // 如果返回值<0,那么this就要排到o的前邊
//  public int compareTo(Student o) {
//      return this.age - o.age;
//  }

    @Override
    public int compareTo(Student o) {
        return o.score - this.score;
    }

SynchronousQueue - 同步隊列 - 只允許存儲一個元素

并發(fā)映射 - ConcurrentMap

HashMap - 底層依靠數(shù)組加鏈表的形式存儲,默認初始容量16,默認加載因子為0.75f、每次擴容增加一倍,本身是一個異步式線程不安全的映射

Hashtable - 同步式線程安全映射 -- 對外提供的都是同步方法。

ConcurrentHashMap - 異步式線程安全的映射 - 在jdk1.8之前,采用分段(分桶)鎖,分段鎖采用的是讀寫鎖的機制(讀鎖:允許多個線程讀,但是不允許線程寫;寫鎖,允許一個線程寫,但是不允許線程讀)
jdk1.8不再采用鎖機制,而是CAS(Compate and Swap)算法,減小了鎖的開銷;
如果一個桶中的元素個數(shù)超過了8個,哪個會將這個桶的鏈表扭轉(zhuǎn)成一顆紅黑樹(自平衡二叉樹的結(jié)構(gòu))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容