ThreadLocal 源码之 cleanSomeSlots

ThreadLocal 系列 1: cleanSomeSlots



一、源码分析

先贴上源码:

/**
主要作用:
进行一定次数的循环,从当位置i开始往后寻找脏entry并清理掉,当清理脏entry时,使用expungeStaleEntry方法,从当前脏entry会再往后寻找脏entry进行清理,碰到null时结束。
可以看到这个清理的过程只是覆盖了一段范围,并不是全部区间。
*/
private boolean cleanSomeSlots(int i, int n) {
            boolean removed = false;
            Entry[] tab = table;
            int len = tab.length;
            do {
                i = nextIndex(i, len);
                Entry e = tab[i];
                if (e != null && e.get() == null) {
                    n = len;
                    removed = true;
                    i = expungeStaleEntry(i);
                }
            } while ( (n >>>= 1) != 0);
            return removed;
        }

主要作用:
循环的去寻找脏Entry,即key=null的Entry,然后进行删除。

详细说明:
n >>>= 1 说明要循环log2N次。在没有发现脏Entry时,会一直往后找下个位置的entry是否是脏的,如果是的话,就会使 n = 数组的长度。然后继续循环log2新N 次。
参考图画:



版权声明:本文为myloveinnocence原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。