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

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

《java.util.concurrent 包源碼閱讀》18 Exchanger

2019-11-14 21:00:58
字體:
來源:轉載
供稿:網友
java.util.concurrent 包源碼閱讀》18 Exchanger

Exchanger可以看做雙向數據傳輸的SynchronousQueue,即沒有生產者和消費者之分,任意兩個線程都可以交換數據。

在JDK5中Exchanger被設計成一個容量為1的容器,存放一個等待線程,直到有另外線程到來就會發生數據交換,然后清空容器,等到下一個到來的線程。

從JDK6開始,Exchanger用了類似ConcurrentMap的分段思想,提供了多個slot,增加了并發執行時的吞吐量。

Exchanger不存在公平不公平的模式,因為沒有排隊的情況發生,只要有兩個線程就可以發生數據交換。

直接看核心方法:

    PRivate Object doExchange(Object item, boolean timed, long nanos) {        Node me = new Node(item);        // index是線程ID的hash值映射到0到max之間的一個值        // 一般情況下max為0,這樣線程交換數據只會使用第一個slot,        // 即index是0,而max不為0情況請看下面的循環        int index = hashIndex();        // CAS操作失敗的次數        int fails = 0;        for (;;) {            // 當前slot中存儲的對象,也就是Node            Object y;            Slot slot = arena[index];            // 延遲加載,即只有當slot為null時才創建一個slot            // 延遲加載后重新循環一次            if (slot == null)                createSlot(index);            // slot中有數據,也就意味著有線程在等待交換數據            // 這時可以嘗試用CAS重置slot(把slot存儲的對象設為null)            // 用slot中存儲的對象和當前線程進行數據交換            // 如果交換成功就通知原先等待的線程            else if ((y = slot.get()) != null &&                     slot.compareAndSet(y, null)) {                Node you = (Node)y;                if (you.compareAndSet(null, item)) {                    LockSupport.unpark(you.waiter);                    return you.item;                }                // 如果slot存儲的對象已經被重置為null,但是數據交換失敗了                // 這時就意味著這個等待的線程的交換請求被取消了                // 在分析wait類型的方法代碼時會看到如何處理這種情況            }            // 如果slot中沒有存儲對象,那么首先嘗試把當前線程存儲到slot中            // 如果存儲失敗了,就重新循環            else if (y == null &&                     slot.compareAndSet(null, me)) {                // index為0意味著僅僅有當前線程在等待交換數據,因此直接等待即可                if (index == 0)                    return timed ?                        awaitNanos(me, slot, nanos) :                        await(me, slot);                // 所謂的spin wait:就是固定次數循環,每次計數減一                // 對于單核系統來說,spin wait是不做的,因為單核                // 做wait時需要占用CPU,其他線程是無法使用CPU,因此這樣                // 的等待毫無意義。而多核系統中spin值為2000,也就是會做                // 2000次循環。                // 如果循環完成后依然沒有得到交換的數據,那么會返回一個                // CANCEL對象表示請求依舊被取消,并且把Node從slot中清除                Object v = spinWait(me, slot);                if (v != CANCEL)                    return v;                // 如果取消了,就新建一個Node取消原先取消的Node用于下次循環                me = new Node(item);                int m = max.get();                // index除2,縮小slot的范圍                // 同時如果m過大,減小m                if (m > (index >>>= 1))                    max.compareAndSet(m, m - 1);            }            // 允許CAS失敗兩次,因為兩個else if中都有CAS,因此這里            // 允許兩個else if的CAS操作都失敗過            else if (++fails > 1) {                int m = max.get();                // 失敗超過3次,增大m,并且從m處重新索引                if (fails > 3 && m < FULL && max.compareAndSet(m, m + 1))                    index = m + 1;                // 當index小于0,回到m,重新循環                else if (--index < 0)                    index = m;            }        }    }

這篇文章關于索引index這塊弄得不是很清楚,后續會繼續研究,及時更新。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产91| 欧美在线观看一区二区三区| 91国内揄拍国内精品对白| 国产精品对白刺激| 91av在线国产| 国产精品一区二区久久| 成人精品视频99在线观看免费| 久久精品国产视频| 精品无码久久久久久国产| 久久国产精品偷| 97在线看福利| 亚洲资源在线看| 国产精品专区h在线观看| 亚洲影视中文字幕| 国外视频精品毛片| 国产91在线播放| 97在线免费视频| 国产成人小视频在线观看| 亚洲成色777777女色窝| 深夜精品寂寞黄网站在线观看| 久久久精品在线观看| 综合国产在线视频| 午夜精品一区二区三区在线| 欧美大人香蕉在线| 精品久久久久久久中文字幕| 欧美高清无遮挡| 亚洲美女自拍视频| 欧美极品第一页| 美女扒开尿口让男人操亚洲视频网站| 国产成人激情小视频| 欧美老女人bb| 国产亚洲一区二区在线| 成人免费观看49www在线观看| 国产美女久久精品| 欧美日韩中文字幕在线| 亚洲精品一区中文字幕乱码| 日韩在线播放视频| 高清欧美性猛交xxxx黑人猛交| 青青草精品毛片| 亚洲国模精品一区| 日韩精品日韩在线观看| 欧美国产极速在线| 在线电影中文日韩| 午夜欧美不卡精品aaaaa| 欧美影院在线播放| 成人精品视频99在线观看免费| 亚洲久久久久久久久久久| 日韩不卡在线观看| 日韩精品极品在线观看播放免费视频| 亚洲18私人小影院| 狠狠躁天天躁日日躁欧美| 亚洲精品网站在线播放gif| 91久久精品在线| 欧美成人激情图片网| 日韩一级裸体免费视频| 俺也去精品视频在线观看| 欧美第一黄色网| 欧美国产精品人人做人人爱| 91精品久久久久久久久久另类| 国产精品久久久久久久久久久不卡| 国产精品扒开腿做| 亚洲一区二区三区sesese| 国内精品国产三级国产在线专| 欧美专区国产专区| 久久久999国产精品| 亚洲加勒比久久88色综合| 日韩av在线免费看| 色yeye香蕉凹凸一区二区av| 欧美小视频在线| 亚洲精品成人免费| 亚洲qvod图片区电影| 国产999精品久久久| 91sao在线观看国产| 国产午夜精品免费一区二区三区| 欧美性xxxxhd| 在线视频国产日韩| 91av中文字幕| 亚洲午夜性刺激影院| 中文字幕不卡在线视频极品| 国产日韩中文在线| 亚洲欧洲高清在线| 久久精彩免费视频| 91精品中国老女人| 亚洲韩国青草视频| 中文字幕在线成人| 亚洲人成电影在线| 国产日产久久高清欧美一区| 精品国产31久久久久久| 2020国产精品视频| 欧美最猛性xxxxx(亚洲精品)| 国产精品亚发布| 久久亚洲精品成人| 中文字幕亚洲无线码在线一区| 国产精品视频在线观看| 欧美在线一级va免费观看| 日韩免费在线观看视频| 久久久视频精品| 欧美疯狂性受xxxxx另类| 福利一区福利二区微拍刺激| 国产精品一久久香蕉国产线看观看| 98精品国产自产在线观看| 国产精品∨欧美精品v日韩精品| 欧美激情精品久久久久久久变态| 日本精品久久中文字幕佐佐木| 日本乱人伦a精品| 在线性视频日韩欧美| 一夜七次郎国产精品亚洲| 亚洲欧美在线播放| 在线电影av不卡网址| 一区二区三区四区视频| 国产精品视频不卡| 亚洲аv电影天堂网| 日韩精品中文字幕有码专区| 欧美激情综合色| 在线精品国产欧美| 这里精品视频免费| 精品国产福利视频| 日韩在线视频观看正片免费网站| www.日韩av.com| 国产亚洲精品高潮| 欧美午夜片欧美片在线观看| 日韩福利在线播放| 国产亚洲精品成人av久久ww| 亚洲第一中文字幕在线观看| 欧美国产日产韩国视频| 欧美国产中文字幕| 在线观看日韩www视频免费| 一区二区三区视频在线| 欧美在线观看网站| 亚洲精品suv精品一区二区| 日韩av片电影专区| 国产精品av网站| 国产美女扒开尿口久久久| 成人激情视频在线观看| 国产欧美精品一区二区三区-老狼| 欧美日韩午夜视频在线观看| 国产精品久久久久久中文字| 国产视频精品自拍| 成人中文字幕+乱码+中文字幕| 91网站免费看| www.国产一区| 色哟哟入口国产精品| 欧美精品电影免费在线观看| 日韩在线视频观看| 亚洲福利在线视频| 欧美日韩另类在线| 国产日韩欧美中文在线播放| 欧美精品电影免费在线观看| 91久久精品国产91久久性色| 久久99精品视频一区97| 亚洲电影av在线| 欧美激情高清视频| 这里只有精品在线观看| 国产精品午夜一区二区欲梦| 欧美综合国产精品久久丁香| 美日韩精品视频免费看| 欧美成人精品不卡视频在线观看| 国产精品大陆在线观看| 欧美成人精品在线| 91精品国产综合久久久久久久久| 久久精品在线视频| 中文字幕精品一区二区精品| 日韩美女激情视频| 国产精品主播视频|