最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Netty分布式高性能工具類(lèi)同線(xiàn)程下回收對(duì)象解析

 更新時(shí)間:2022年03月29日 16:43:28   作者:向南是個(gè)萬(wàn)人迷  
這篇文章主要為大家介紹了Netty分布式高性能工具類(lèi)同線(xiàn)程下回收對(duì)象解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

同線(xiàn)程回收對(duì)象

上一小節(jié)剖析了從recycler中獲取一個(gè)對(duì)象, 這一小節(jié)分析在創(chuàng)建和回收是同線(xiàn)程的前提下, recycler是如何進(jìn)行回收的

回顧第三小節(jié)的demo中的main方法

public static void main(String[] args){
    User user1 = RECYCLER.get();
    user1.recycle();
    User user2 = RECYCLER.get();
    user2.recycle();
    System.out.println(user1==user2);
}

這里就是一個(gè)同線(xiàn)程回收對(duì)象的典型場(chǎng)景, 在一個(gè)線(xiàn)程中將對(duì)象創(chuàng)建并且回收, 我們的User對(duì)象定義了recycle方法

static class User{
    private final Recycler.Handle<User> handle;
    public User(Recycler.Handle<User> handle){
        this.handle=handle;
    }
    public void recycle(){
        handle.recycle(this);
    }
}

這里的recycle是通過(guò)handle對(duì)象的recycle方法實(shí)現(xiàn)對(duì)象回收的, 這里實(shí)際調(diào)用的是DefaultHandle的recycle方法

我們跟進(jìn)recycle方法

public void recycle(Object object) {
    if (object != value) {
        throw new IllegalArgumentException("object does not belong to handle");
    }
    stack.push(this);
}

這里如果回收的對(duì)象為null, 則拋出異常

如果不為null, 則通過(guò)自身綁定stack的push方法將自身push到stack中

跟到push方法中:

void push(DefaultHandle<?> item) {
    Thread currentThread = Thread.currentThread();
    if (thread == currentThread) {
        pushNow(item);
    } else {
        pushLater(item, currentThread);
    }
}

這里首先判斷當(dāng)前線(xiàn)程, 和創(chuàng)建stack的時(shí)候保存的線(xiàn)程是否是同一線(xiàn)程, 如果是, 說(shuō)明是同線(xiàn)程回收對(duì)象, 則執(zhí)行pushNow方法將對(duì)象放入stack中

跟到pushNow方法中:

private void pushNow(DefaultHandle<?> item) {
    if ((item.recycleId | item.lastRecycledId) != 0) {
        throw new IllegalStateException("recycled already");
    }
    item.recycleId = item.lastRecycledId = OWN_THREAD_ID;
    int size = this.size;
    if (size >= maxCapacity || dropHandle(item)) {
        return;
    }
    if (size == elements.length) {
        elements = Arrays.copyOf(elements, min(size << 1, maxCapacity));
    }
    elements[size] = item;
    this.size = size + 1;
}

如果第一次回收, item.recycleId和item.lastRecycledId都為0, 所以不會(huì)進(jìn)入if塊, 我們繼續(xù)往下看

 item.recycleId = item.lastRecycledId = OWN_THREAD_ID 這一步將handle的recycleId和lastRecycledId賦值為OWN_THREAD_ID, OWN_THREAD_ID在每一個(gè)recycle中是唯一固定的, 這里我們只需要記得這個(gè)概念就行

然后獲取當(dāng)前size

如果size超過(guò)上限大小, 則直接返回

這里還有個(gè)判斷dropHandle, 我們跟進(jìn)去:

boolean dropHandle(DefaultHandle<?> handle) {
    if (!handle.hasBeenRecycled) {
        if ((++handleRecycleCount & ratioMask) != 0) {
            return true;
        }
        handle.hasBeenRecycled = true;
    }
    return false;
}

 if (!handle.hasBeenRecycled) 表示當(dāng)前對(duì)象之前是否沒(méi)有被回收過(guò), 如果是第一次回收, 這里會(huì)返回true, 然后進(jìn)入放到if

再看if中的判斷

 if ((++handleRecycleCount & ratioMask) != 0) 

handleRecycleCount表示當(dāng)前位置stack回收了多少次對(duì)象(回收了多少次, 不代表回收了多少個(gè)對(duì)象, 因?yàn)椴皇敲看位厥斩紩?huì)被成功的保存在stack), ratioMask我們之前分析過(guò)是7, 這里 (++handleRecycleCount & ratioMask) != 0 表示回收的對(duì)象數(shù)如果不是8的倍數(shù), 則返回true, 表示只回收1/8的對(duì)象

然后將hasBeenRecycled設(shè)置為true, 表示已經(jīng)被回收

回到pushNow方法中:

如果size的大小等于stack中的數(shù)組elements的大小, 則將數(shù)組elements進(jìn)行擴(kuò)容

最后將size通過(guò)數(shù)組下標(biāo)的方式將當(dāng)前handle設(shè)置到elements的元素中, 并將size進(jìn)行自增

以上就是同線(xiàn)程回收對(duì)象的邏輯,更多關(guān)于Netty分布式同線(xiàn)程回收對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

抚顺市| 徐水县| 望城县| 贵港市| 大丰市| 大余县| 济南市| 濮阳县| 丹阳市| 清水河县| 福建省| 新闻| 扶余县| 瓦房店市| 黑河市| 吕梁市| 谢通门县| 四子王旗| 鄯善县| 黔西县| 靖安县| 沽源县| 曲阳县| 揭阳市| 开鲁县| 武陟县| 保定市| 拉萨市| 乌兰察布市| 德昌县| 靖边县| 阜平县| 象山县| 安仁县| 巧家县| 英超| 闻喜县| 南阳市| 忻城县| 错那县| 宜川县|