欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

同線程回收對象

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

回顧第三小節(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);
}

這里就是一個同線程回收對象的典型場景, 在一個線程中將對象創(chuàng)建并且回收, 我們的User對象定義了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對象的recycle方法實現對象回收的, 這里實際調用的是DefaultHandle的recycle方法

我們跟進recycle方法

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

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

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

跟到push方法中:

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

這里首先判斷當前線程, 和創(chuàng)建stack的時候保存的線程是否是同一線程, 如果是, 說明是同線程回收對象, 則執(zhí)行pushNow方法將對象放入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, 所以不會進入if塊, 我們繼續(xù)往下看

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

然后獲取當前size

如果size超過上限大小, 則直接返回

這里還有個判斷dropHandle, 我們跟進去:

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

 if (!handle.hasBeenRecycled) 表示當前對象之前是否沒有被回收過, 如果是第一次回收, 這里會返回true, 然后進入放到if

再看if中的判斷

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

handleRecycleCount表示當前位置stack回收了多少次對象(回收了多少次, 不代表回收了多少個對象, 因為不是每次回收都會被成功的保存在stack), ratioMask我們之前分析過是7, 這里 (++handleRecycleCount & ratioMask) != 0 表示回收的對象數如果不是8的倍數, 則返回true, 表示只回收1/8的對象

然后將hasBeenRecycled設置為true, 表示已經被回收

回到pushNow方法中:

如果size的大小等于stack中的數組elements的大小, 則將數組elements進行擴容

最后將size通過數組下標的方式將當前handle設置到elements的元素中, 并將size進行自增

以上就是同線程回收對象的邏輯,更多關于Netty分布式同線程回收對象的資料請關注腳本之家其它相關文章!

相關文章

  • 關于JFormDesigner的安裝及破解超詳細教程

    關于JFormDesigner的安裝及破解超詳細教程

    JFormDesigner是一種先進的圖形用戶界面Swing?的設計工具(非開源),具有一個獨立的開發(fā)工具產品和基于不同開發(fā)工具如Eclipse、NetBeans等的開發(fā)插件,本文給大家介紹JFormDesigner安裝破解教程,感興趣的朋友一起看看吧
    2023-12-12
  • 老生常談 MyBatis 復雜查詢

    老生常談 MyBatis 復雜查詢

    這篇文章主要介紹了 MyBatis 復雜查詢的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • java中a=a+1和a+=1的區(qū)別介紹

    java中a=a+1和a+=1的區(qū)別介紹

    這篇文章主要介紹了java中a=a+1和a+=1的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 基于Java設計一個高并發(fā)的秒殺系統(tǒng)

    基于Java設計一個高并發(fā)的秒殺系統(tǒng)

    這篇文章主要為大家詳細介紹了如何基于Java設計一個高并發(fā)的秒殺系統(tǒng),文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考下
    2023-10-10
  • java代碼如何讀取bootstrap.yml配置信息

    java代碼如何讀取bootstrap.yml配置信息

    這篇文章主要介紹了java代碼如何讀取bootstrap.yml配置信息問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java自動釋放鎖的三種實現方案

    Java自動釋放鎖的三種實現方案

    在筆者面試過程時,經常會被問到各種各樣的鎖,如樂觀鎖、讀寫鎖等等,非常繁多,下面這篇文章主要給大家介紹了關于Java自動釋放鎖的三種實現方案,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • Java中@valid和@Validated注解的使用詳解

    Java中@valid和@Validated注解的使用詳解

    這篇文章主要介紹了Java中@valid和@Validated注解的使用詳解,@Validated可以用在類型、方法和方法參數上,但是不能用在成員屬性(字段)上,不支持嵌套檢測,@Valid可以用在方法、構造函數、方法參數和成員屬性(字段)上,支持嵌套檢測,需要的朋友可以參考下
    2024-01-01
  • JavaMail入門教程之解析郵件(5)

    JavaMail入門教程之解析郵件(5)

    這篇文章主要為大家詳細介紹了JavaMail入門教程之解析郵件的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • java單機接口限流處理方案詳解

    java單機接口限流處理方案詳解

    這篇文章主要為大家詳細介紹了java單機接口限流處理方案,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java實現url加密處理的方法示例

    Java實現url加密處理的方法示例

    這篇文章主要介紹了Java實現url加密處理的方法,涉及java基于base64、編碼轉換實現加密解密相關操作技巧,需要的朋友可以參考下
    2017-06-06

最新評論