亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

《java.util.concurrent 包源碼閱讀》19 PriorityBlockingQueue

2019-11-14 21:01:17
字體:
來源:轉載
供稿:網友
java.util.concurrent 包源碼閱讀》19 PRiorityBlockingQueue

前面講ScheduledThreadPoolExecutor曾經重點講到了DelayedWorkQueue,這里說的PriorityBlockingQueue其實是DelayedWorkQueue的簡化版本,實現了按序排列元素的功能。也就是說PriorityBlockingQueue是維護一個按序排列的隊列,排序的方法可以通過指定Comparator來比較元素的大小,或者元素類型本身實現了Comparable接口。

因此PriorityBlockingQueue也是使用基于數組的二叉堆來實現的。

首先還是看看offer方法:

    public boolean offer(E e) {        if (e == null)            throw new NullPointerException();        final ReentrantLock lock = this.lock;        // 鎖定這個隊列        lock.lock();        int n, cap;        Object[] array;        // 如果數組已滿,則嘗試為數組擴容        while ((n = size) >= (cap = (array = queue).length))            tryGrow(array, cap);        try {            Comparator<? super E> cmp = comparator;            if (cmp == null)                // 沒有comparator情況下,元素類型必須實現Comparable接口                // 使用compare方法進行比較,然后插入元素到堆中                siftUpComparable(n, e, array);            else                // 制定comparator的情況下,插入元素使用comparator                // 比較元素,然后插入元素到堆中                siftUpUsingComparator(n, e, array, cmp);            size = n + 1;            notEmpty.signal();        } finally {            lock.unlock();        }        return true;    }

這里看一下tryGrow,在對數組進行擴容時釋放了主鎖的,因為分配空間本身是不需要主鎖的,只有更新數組時才會要主鎖。

這樣可以提高并發執行的性能,減少阻塞。

    private void tryGrow(Object[] array, int oldCap) {        // 擴容數組時,釋放主鎖,這樣其他取走元素的操作就可以正常        // 操作了。這里使用一個簡單的allocationSpinLock作為鎖,        // 它的值為1表示鎖正在被使用,為0表示鎖為被占用。        // 在獲取該鎖時,用的CAS操作,而釋放時,因為鎖已經占用,        // 直接賦值為0即可。        // 分配空間本身是用不到主鎖的,只有更新數組的時候才需要。        lock.unlock();        Object[] newArray = null;        if (allocationSpinLock == 0 &&            UNSAFE.compareAndSwapInt(this, allocationSpinLockOffset,                                     0, 1)) {            try {                int newCap = oldCap + ((oldCap < 64) ?                                       (oldCap + 2) :                                       (oldCap >> 1));                if (newCap - MAX_ARRAY_SIZE > 0) {                    int minCap = oldCap + 1;                    // 整數溢出                    if (minCap < 0 || minCap > MAX_ARRAY_SIZE)                        throw new OutOfMemoryError();                    newCap = MAX_ARRAY_SIZE;                }                // 如果數組被更新了,就沒有必要再分配新的空間了                if (newCap > oldCap && queue == array)                    newArray = new Object[newCap];            } finally {                allocationSpinLock = 0;            }        }        // 其他線程正在占用allocationSpinLock,調用yield告訴線程調度        // 如果其他線程需要CPU,可以先拿去,我過會再執行,否則我繼續執行。        if (newArray == null) // back off if another thread is allocating            Thread.yield();        // 因為要返回,再次獲取主鎖,而且后面可能要更新數組也需要主鎖        lock.lock();        // 如果分配新空間成功,而且原先的隊列沒有被其他的線程更新過        // 就更新數組。這里不需要使用CAS,因為這個時候已經占用主鎖了        if (newArray != null && queue == array) {            queue = newArray;            System.arraycopy(array, 0, newArray, 0, oldCap);        }

再看取走元素的核心方法extract(poll方法也是使用這個方法從堆中拿走元素)

    private E extract() {        E result;        int n = size - 1;        if (n < 0)            result = null;        else {            // 取走第一個元素            Object[] array = queue;            result = (E) array[0];            E x = (E) array[n];            array[n] = null;            Comparator<? super E> cmp = comparator;            if (cmp == null)                siftDownComparable(0, x, array, n);            else                siftDownUsingComparator(0, x, array, n, cmp);            size = n;        }        return result;    }

這里提一下PriorityBlockingQueue的序列化。PriorityBlockingQueue內置了一個PriorityQueue對象,序列化會把元素轉存到這個PriorityQueue中,然后再進行序列化。

反序列化時也是用PriorityQueue讀取,然后再把元素轉存回PriorityBlockingQueue自己的隊列。

private PriorityQueue q;

下一篇會講具有DelayedWorkQueue的另外一個功能延遲執行的DelayQueue。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品视频在线观看免费| 欧美国产视频日韩| 欧美自拍视频在线观看| 亚洲激情视频在线播放| 亚洲精选在线观看| 成人免费网站在线看| 黄色一区二区三区| 中文字幕国产亚洲2019| 久久精品国产久精国产一老狼| 91网站在线免费观看| 亚洲最新av在线| 日韩av在线资源| 久热精品视频在线观看| 国外成人免费在线播放| 欧美老女人性视频| 性欧美办公室18xxxxhd| 2019国产精品自在线拍国产不卡| 欧美亚洲一级片| 国产成人一区二区三区小说| 91精品久久久久久久久久久| 欧美视频在线观看 亚洲欧| 伊人久久久久久久久久| 色偷偷88888欧美精品久久久| 欧美国产中文字幕| 亚洲色图激情小说| 国产精品久久久久久av| 亚洲天堂免费视频| 欧美日韩国产va另类| 国产亚洲精品日韩| 日韩美女免费观看| 亚洲国产精彩中文乱码av在线播放| 亚洲综合在线做性| 国产丝袜视频一区| 久久久999国产精品| 精品日本高清在线播放| 日韩中文字幕在线视频播放| 日韩风俗一区 二区| 欧美最猛性xxxxx亚洲精品| 国产视频精品一区二区三区| 欧美精品免费在线| 国产日韩欧美日韩大片| 亚洲国产成人精品一区二区| 日韩女优人人人人射在线视频| 精品久久久久久久久久ntr影视| 亚洲福利视频在线| 亚洲男女性事视频| 欧美成人在线影院| 国产精品青青在线观看爽香蕉| 永久免费毛片在线播放不卡| 中日韩午夜理伦电影免费| www国产亚洲精品久久网站| 中文字幕日韩精品在线观看| 最近2019好看的中文字幕免费| 欧美日本亚洲视频| 欧美插天视频在线播放| 欧美亚洲视频一区二区| 精品国产老师黑色丝袜高跟鞋| 亚洲精品不卡在线| 中文字幕亚洲一区二区三区五十路| 2024亚洲男人天堂| 亚洲精品一区二区在线| 国产色综合天天综合网| 国产在线播放不卡| 日韩毛片中文字幕| 欧美极品美女视频网站在线观看免费| 亚洲第一区在线| 欧美日韩精品在线视频| 欧美成人在线免费| 亚洲第一精品电影| 久久色在线播放| 亚洲一区中文字幕在线观看| 久久亚洲精品视频| 欧日韩不卡在线视频| 日韩av综合中文字幕| 国产视频观看一区| 91欧美精品午夜性色福利在线| 欧美视频一区二区三区…| 精品久久久久久久久久久久久| 亚洲精品国产电影| 欧美性猛交xxxx偷拍洗澡| 亚洲精品乱码久久久久久按摩观| 日韩高清中文字幕| 日韩精品中文字幕在线播放| 国产精品久久久久久久久久三级| 啊v视频在线一区二区三区| 日韩欧美亚洲范冰冰与中字| 国产99久久精品一区二区永久免费| 日韩电影中文字幕在线| 欧美日韩福利在线观看| 精品久久久久久久久中文字幕| 久久久久久成人精品| 欧美激情一区二区三区成人| 国产精品美女呻吟| 亚洲成人av在线播放| 在线电影欧美日韩一区二区私密| 国产精品偷伦视频免费观看国产| 中国china体内裑精亚洲片| 国产精品第一第二| 国产精品国产三级国产aⅴ浪潮| 久久深夜福利免费观看| 丝袜美腿亚洲一区二区| 亚洲free性xxxx护士hd| 最新国产精品拍自在线播放| 中文字幕免费精品一区高清| 欧美日韩美女在线| 欧美激情综合亚洲一二区| 国内精品久久久久久中文字幕| 久久亚洲精品成人| 97色在线视频| 亚洲欧美国产日韩天堂区| 欧美日韩国产中文字幕| 欧美午夜片在线免费观看| 久久人人爽人人爽爽久久| 日韩成人中文字幕在线观看| 亚洲激情在线视频| 日韩网站免费观看| 久久综合亚洲社区| 久久夜色精品国产亚洲aⅴ| 国产精品久久久久9999| 青青a在线精品免费观看| 久久91亚洲精品中文字幕奶水| 国产色视频一区| 日韩中文字幕在线视频播放| 日韩视频免费看| 日韩成人中文字幕| 亚洲区一区二区| 91av国产在线| 亚洲欧美日韩精品久久奇米色影视| 91嫩草在线视频| 激情久久av一区av二区av三区| 日韩精品视频免费在线观看| 国产精品久久电影观看| 国产精品丝袜久久久久久高清| 最近2019年好看中文字幕视频| 午夜免费在线观看精品视频| 国产精品久久久久久久久免费看| 国产欧美日韩亚洲精品| 欧美高清性猛交| 91精品久久久久久久久久久久久久| 日韩中文字幕在线观看| 精品国产自在精品国产浪潮| 日韩av大片在线| 日韩在线观看免费网站| 日韩高清中文字幕| 97在线视频免费播放| 2025国产精品视频| 国产精品美女久久久免费| 国产mv免费观看入口亚洲| 中文字幕久热精品视频在线| 一本色道久久88综合日韩精品| 欧美日韩国产激情| 韩国精品久久久999| 欧美猛交ⅹxxx乱大交视频| 一本一本久久a久久精品综合小说| 国产精品一区二区三区久久久| 久久久女人电视剧免费播放下载| 亚洲最大中文字幕| 影音先锋日韩有码| 日本一区二区三区四区视频| 亚洲欧美制服丝袜| 中文字幕欧美精品日韩中文字幕| 91麻豆国产语对白在线观看| 欧美日韩免费区域视频在线观看| 91亚洲精品一区|