中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ArrayBlockingQueue知識點有哪些

發布時間:2021-10-20 18:13:26 來源:億速云 閱讀:187 作者:柒染 欄目:大數據

這期內容當中小編將會給大家帶來有關ArrayBlockingQueue知識點有哪些,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

JDK1.8版本,整理有關ArrayBlockingQueue的知識點,并對其中主要的方法進行分析

特點

1.有界隊列(基于數組實現的)

2.先進先出

3.如果隊列滿了,put操作會阻塞;如果隊列空了,take操作會阻塞。

4.支持公平或者非公平的策略(因為內部是使用ReentrantLock來實現阻塞的),公平策略(降低吞吐量)

5.使用經典的雙條件算法來保證阻塞功能

6.寫數據和消費數據使用同一把鎖(這就導致寫數據和消費數據并不能真正的并發)

主要方法

1.add(),offer(),put()方法

三者都是插入方法,add()時如果隊列滿了,會拋出異常;offer()如果隊列滿了,返回false;put方法,如果隊列滿了,阻塞等待

add()方法:
public boolean add(E e) {
        return super.add(e);//調用父類的add(),父類中又調用了offer()方法,所以最終還是調用offer()方法
    }
offer()方法
public boolean offer(E e) {
        checkNotNull(e); //判斷元素是否為空
        final ReentrantLock lock = this.lock;
        lock.lock();//獲取鎖
        try {
            if (count == items.length) //判斷隊列是否已滿,如果滿了 直接返回 false
                return false;
            else {
                enqueue(e); //放入隊列中
                return true;
            }
        } finally {
            lock.unlock(); //釋放鎖
        }
    }
put()方法
 public void put(E e) throws InterruptedException {
        checkNotNull(e);//檢查元素是否為空
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();//獲取鎖
        try {
            while (count == items.length)//判斷隊列是否已滿,如果滿了,阻塞當前線程
                notFull.await(); //等待
            enqueue(e); //插入隊列
        } finally {
            lock.unlock(); // 釋放鎖
        }
    }	

2.poll(),take(),peek()方法

三者都是元素出隊方法
1.peek()取出元素,但不會刪除元素
2.poll()取出元素,并刪除元素
3.take()取出元素,并且刪除,如果隊列為空的話,阻塞當前操作

1.peek()方法
 public E peek() {
        final ReentrantLock lock = this.lock;
        lock.lock(); //獲取鎖
        try {
            return itemAt(takeIndex); // 獲取元素
        } finally {
            lock.unlock(); //釋放鎖
        }
    }
2.poll()
public E poll() {
        final ReentrantLock lock = this.lock;
        lock.lock();//獲取鎖
        try {
            return (count == 0) ? null : dequeue(); //獲取元素,并且刪除元素
        } finally {
            lock.unlock();//釋放鎖
        }
    }
3.take()
 public E take() throws InterruptedException {
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();//獲取鎖
        try {
            while (count == 0) //隊列為空阻塞
                notEmpty.await();
            return dequeue(); //獲取元素,并刪除
        } finally {
            lock.unlock(); //釋放鎖
        }
    }

3.remove()方法

remove()移除元素,使用循環的方式移除

1.remove()方法
public boolean remove(Object o) {
        if (o == null) return false; //這個地方為什么不能直接拋異常
        final Object[] items = this.items;
        final ReentrantLock lock = this.lock; 
        lock.lock();//獲取鎖
        try {
            if (count > 0) {
                final int putIndex = this.putIndex;
                int i = takeIndex;
                do { //循環,直到找到要刪除的元素
                    if (o.equals(items[i])) {
                        removeAt(i);
                        return true;
                    }
                    if (++i == items.length)
                        i = 0;
                } while (i != putIndex);
            }
            return false;
        } finally {
            lock.unlock(); //釋放鎖
        }
    }

上述就是小編為大家分享的ArrayBlockingQueue知識點有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

抚远县| 张家川| 溧水县| 大石桥市| 青浦区| 台南市| 诏安县| 东至县| 鸡泽县| 玉林市| 汉沽区| 广西| 岳西县| 彭水| 五峰| 喀什市| 阿拉尔市| 德州市| 鹤壁市| 中江县| 孝义市| 安溪县| 顺昌县| 沁水县| 马鞍山市| 望奎县| 靖州| 合山市| 渑池县| 东丰县| 邻水| 交口县| 喜德县| 云安县| 秦皇岛市| 盐津县| 锡林郭勒盟| 常熟市| 灵台县| 福安市| 南乐县|