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

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

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

同線程回收對(duì)象

上一小節(jié)剖析了從recycler中獲取一個(gè)對(duì)象, 這一小節(jié)分析在創(chuàng)建和回收是同線程的前提下, 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è)同線程回收對(duì)象的典型場(chǎng)景, 在一個(gè)線程中將對(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是通過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, 則通過自身綁定stack的push方法將自身push到stack中

跟到push方法中:

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

這里首先判斷當(dāng)前線程, 和創(chuàng)建stack的時(shí)候保存的線程是否是同一線程, 如果是, 說明是同線程回收對(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超過上限大小, 則直接返回

這里還有個(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ì)象之前是否沒有被回收過, 如果是第一次回收, 這里會(huì)返回true, 然后進(jìn)入放到if

再看if中的判斷

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

handleRecycleCount表示當(dāng)前位置stack回收了多少次對(duì)象(回收了多少次, 不代表回收了多少個(gè)對(duì)象, 因?yàn)椴皇敲看位厥斩紩?huì)被成功的保存在stack), ratioMask我們之前分析過是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通過數(shù)組下標(biāo)的方式將當(dāng)前handle設(shè)置到elements的元素中, 并將size進(jìn)行自增

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

相關(guān)文章

最新評(píng)論

翁源县| 霸州市| 大兴区| 大英县| 蓬溪县| 泾川县| 固安县| 鸡泽县| 竹北市| 新和县| 武清区| 德令哈市| 土默特右旗| 富蕴县| 特克斯县| 红河县| 韩城市| 宣恩县| 大同市| 兰坪| 玛曲县| 县级市| 琼海市| 玉环县| 延寿县| 吴旗县| 逊克县| 罗定市| 建德市| 汉寿县| 卓资县| 博爱县| 六盘水市| 钟祥市| 宝鸡市| 勃利县| 亚东县| 肇东市| 临海市| 鄢陵县| 堆龙德庆县|