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

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

《java.util.concurrent 包源碼閱讀》07 LinkedBlockingQueue

2019-11-14 20:50:19
字體:
來源:轉載
供稿:網友
java.util.concurrent 包源碼閱讀》07 LinkedBlockingQueue

這篇文章來說說稍微復雜一些的LinkedBlockingQueue。LinkedBlockingQueue使用一個鏈表來實現,會有一個head和tail分別指向隊列的開始和隊列的結尾。因此LinkedBlockingQueue會有兩把鎖,分別控制這兩個元素,這樣在添加元素和拿走元素的時候就不會有鎖的沖突,因此取走元素操作的是head,而添加元素操作的是tail。

老規矩先看offer方法和poll方法

    public boolean offer(E e) {        if (e == null) throw new NullPointerException();        final AtomicInteger count = this.count;        if (count.get() == capacity)            return false;        int c = -1;        Node<E> node = new Node(e);        final ReentrantLock putLock = this.putLock;        putLock.lock();        try {            if (count.get() < capacity) {                enqueue(node);                c = count.getAndIncrement();                if (c + 1 < capacity)                    notFull.signal();            }        } finally {            putLock.unlock();        }        if (c == 0)            signalNotEmpty();        return c >= 0;    }

可以看到offer方法在添加元素時候僅僅涉及到putLock,但是還是會需要takeLock,看看signalNotEmpty代碼就知道。而poll方法拿走元素的時候涉及到takeLock,也是會需要putLock。參見signalNotFull()。關于signalNotEmpty會在后面講阻塞的時候講到。

    public E poll() {        final AtomicInteger count = this.count;        if (count.get() == 0)            return null;        E x = null;        int c = -1;        final ReentrantLock takeLock = this.takeLock;        takeLock.lock();        try {            if (count.get() > 0) {                x = dequeue();                c = count.getAndDecrement();                if (c > 1)                    notEmpty.signal();            }        } finally {            takeLock.unlock();        }        if (c == capacity)            signalNotFull();        return x;    }

這里順便說說隊列長度的count,因為有兩把鎖存在,所以如果還是像ArrayBlockingQueue一樣使用基本類型的count的話會同時用到兩把鎖,這樣就會很復雜,因此直接使用原子數據類型AtomicInteger來操作count。

接下來談談阻塞的問題,一個BlockingQueue會有兩個Condition:notFull和notEmpty,LinkedBlockingQueue會有兩把鎖,因此這兩個Condition肯定是由這兩個鎖分別創建的,takeLock創建notEmpty,putLock創建notFull。

    /** Lock held by take, poll, etc */    PRivate final ReentrantLock takeLock = new ReentrantLock();    /** Wait queue for waiting takes */    private final Condition notEmpty = takeLock.newCondition();    /** Lock held by put, offer, etc */    private final ReentrantLock putLock = new ReentrantLock();    /** Wait queue for waiting puts */    private final Condition notFull = putLock.newCondition();

接下來看看put方法:

    public void put(E e) throws InterruptedException {        if (e == null) throw new NullPointerException();        // Note: convention in all put/take/etc is to preset local var        // holding count negative to indicate failure unless set.        int c = -1;        Node<E> node = new Node(e);        final ReentrantLock putLock = this.putLock;        final AtomicInteger count = this.count;        putLock.lockInterruptibly();        try {            /*             * Note that count is used in wait guard even though it is             * not protected by lock. This works because count can             * only decrease at this point (all other puts are shut             * out by lock), and we (or some other waiting put) are             * signalled if it ever changes from capacity. Similarly             * for all other uses of count in other wait guards.             */            while (count.get() == capacity) {                notFull.await();            }            enqueue(node);            c = count.getAndIncrement();            if (c + 1 < capacity)                notFull.signal();        } finally {            putLock.unlock();        }        if (c == 0)            signalNotEmpty();    }

其實大體邏輯和ArrayBlockingQueue差不多,也會需要通知notEmpty條件,因為notEmpty條件屬于takeLock,而調用signal方法需要獲取Lock,因此put方法也是用到了另外一個鎖:takeLock。這里有一點會不同,按照道理來說put方法是不需要通知notFull條件的,是由由拿走元素的操作來通知的,但是notFull條件屬于putLock,而拿走元素時,是用了takeLock,因此這里put方法在擁有putLock的情況通知notFull條件,會讓其他添加元素的方法避免過長時間的等待。同理對于take方法來說也通知notEmpty條件。

    public E take() throws InterruptedException {        E x;        int c = -1;        final AtomicInteger count = this.count;        final ReentrantLock takeLock = this.takeLock;        takeLock.lockInterruptibly();        try {            while (count.get() == 0) {                notEmpty.await();            }            x = dequeue();            c = count.getAndDecrement();            if (c > 1)                notEmpty.signal();        } finally {            takeLock.unlock();        }        if (c == capacity)            signalNotFull();        return x;    }

最后說說remove和contains方法,因為需要操作整個鏈表,因此需要同時擁有兩個鎖才能操作。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲男人天堂古典| 91亚洲国产成人久久精品网站| 国产精品免费看久久久香蕉| 38少妇精品导航| 国产精品扒开腿做爽爽爽的视频| 国产亚洲精品日韩| 亚洲情综合五月天| 久久久久久久久久久亚洲| 日韩精品在线观看视频| 欧美日本中文字幕| 国产精品av免费在线观看| 国产精品成人免费视频| 亚洲国产私拍精品国模在线观看| 亚洲视频视频在线| 97精品国产91久久久久久| 91免费看视频.| 久久国产精品久久久久久| 欧美激情极品视频| 欧美成人高清视频| 国产剧情久久久久久| 欧美国产精品人人做人人爱| 国产综合久久久久久| 亚洲理论在线a中文字幕| 国产成人精品免费久久久久| 国产精品久久久久7777婷婷| 国产欧美亚洲视频| 色妞一区二区三区| 美女黄色丝袜一区| 久久久久久久一区二区三区| 26uuu亚洲国产精品| 色狠狠久久aa北条麻妃| 欧美一级视频免费在线观看| www日韩中文字幕在线看| 久久av在线看| 国产午夜精品视频| 欧美日韩性视频在线| 亚洲国产成人精品久久久国产成人一区| 亚洲天堂av女优| 国外日韩电影在线观看| 欧美在线播放视频| 日本国产欧美一区二区三区| 97国产真实伦对白精彩视频8| 国产精品视频久久久| 在线观看亚洲视频| 97在线视频免费看| 日韩女优人人人人射在线视频| 69视频在线免费观看| 宅男66日本亚洲欧美视频| 国产一区二区三区在线视频| 欧美一级电影久久| 国产一区二区三区在线观看网站| 97超级碰碰碰久久久| 成人黄色免费在线观看| 国产精品视频免费在线观看| 亚洲人成五月天| 97色伦亚洲国产| 久久精品夜夜夜夜夜久久| 成人免费高清完整版在线观看| 日韩av电影中文字幕| 国产在线观看91精品一区| 国产精品福利网站| 夜夜嗨av一区二区三区免费区| 国产精品jvid在线观看蜜臀| 欧美日韩一区二区在线播放| 在线观看91久久久久久| 日本精品视频在线观看| 日韩欧美综合在线视频| 日韩美女免费视频| 欧美激情精品久久久久久变态| 欧美日韩午夜视频在线观看| 国产精品第七十二页| 8x海外华人永久免费日韩内陆视频| 在线视频免费一区二区| 成人黄色免费看| 久久精品国产一区二区三区| 久久在线免费观看视频| 日韩精品久久久久| 日韩欧美视频一区二区三区| 国产精品一区二区三区免费视频| 亚洲石原莉奈一区二区在线观看| 国产一区二区三区在线看| 欧美精品18videosex性欧美| 久久精品国产亚洲精品2020| 欧美在线激情视频| 九九热最新视频//这里只有精品| 91综合免费在线| 色99之美女主播在线视频| 亚洲少妇激情视频| 欧美贵妇videos办公室| 国产亚洲成av人片在线观看桃| 欧美影院在线播放| 欧美电影免费观看高清完整| 日韩国产精品一区| 国产一区二区三区网站| 亚洲美女又黄又爽在线观看| 在线成人一区二区| 日韩中文在线中文网三级| 国产福利精品视频| 欧美孕妇与黑人孕交| 国产在线精品播放| 亚洲久久久久久久久久久| 亚洲精品久久久久中文字幕欢迎你| 中文字幕欧美日韩va免费视频| 青青草一区二区| 久久伊人91精品综合网站| 97高清免费视频| 亚洲人成免费电影| 久久久女人电视剧免费播放下载| 国产精品久久999| 亚洲成人网在线观看| 一区二区欧美激情| 日韩中文字幕免费看| 91精品国产综合久久久久久蜜臀| 亚洲va欧美va国产综合久久| 欧美成人免费大片| 国产精品免费观看在线| 668精品在线视频| 日韩欧美中文字幕在线观看| 欧美精品videos性欧美| 国产91av在线| 亚洲综合在线小说| 中文字幕亚洲激情| 日韩久久精品成人| 日韩在线观看成人| 成人久久久久久| 欧美噜噜久久久xxx| 欧美激情欧美激情在线五月| 国产精品专区h在线观看| 亚洲黄色av女优在线观看| 亚洲精品国产品国语在线| 国产亚洲欧美日韩美女| 91精品久久久久久久久久久久久| 亚洲四色影视在线观看| 久久久久久久久久国产精品| 日韩在线视频一区| 日韩在线视频网| 亚洲电影免费观看高清完整版在线| 超碰97人人做人人爱少妇| 国产精品极品尤物在线观看| 亚洲精品福利在线观看| 国产精品入口免费视频一| 福利精品视频在线| 精品视频偷偷看在线观看| 国产成人精品免高潮在线观看| 日韩精品极品视频免费观看| 国产91对白在线播放| 久久久久久高潮国产精品视| 国产精品自拍偷拍| 久久久久久com| 亚洲欧美日韩爽爽影院| 久久av红桃一区二区小说| 久久99视频免费| 中文字幕亚洲一区二区三区五十路| 国产精品91在线| 国产成人精品久久二区二区| 91亚洲va在线va天堂va国| 国产精品久久99久久| 精品成人久久av| 日韩国产中文字幕| 欧美精品情趣视频| 欧洲美女免费图片一区| 亚洲欧美日韩中文在线制服| 国产91热爆ts人妖在线| 欧美剧在线观看|