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 次。
参考图画: