ThreadLocal的介绍与运用( 九 )


/*** 获取环形数组的下一个索引*/private static int nextIndex(int i, int len) {return ((i + 1 < len) ? i + 1 : 0);}/*** 获取环形数组的上一个索引*/private static int prevIndex(int i, int len) {return ((i - 1 >= 0) ? i - 1 : len - 1);}ThreadLocalMap的set()代码如下:
private void set(ThreadLocal<?> key, Object value) {ThreadLocal.ThreadLocalMap.Entry[] tab = table;int len = tab.length;//计算索引 , 上面已经有说过 。int i = key.threadLocalHashCode & (len-1);/*** 根据获取到的索引进行循环 , 如果当前索引上的table[i]不为空 , 在没有return的情况下 , * 就使用nextIndex()获取下一个(上面提到到线性探测法) 。*/for (ThreadLocal.ThreadLocalMap.Entry e = tab[i];e != null;e = tab[i = nextIndex(i, len)]) {ThreadLocal<?> k = e.get();//table[i]上key不为空 , 并且和当前key相同 , 更新valueif (k == key) {e.value = https://www.huyubaike.com/biancheng/value;return;}/*** table[i]上的key为空 , 说明被回收了* 这个时候说明改table[i]可以重新使用 , 用新的key-value将其替换,并删除其他无效的entry*/if (k == null) {replaceStaleEntry(key, value, i);return;}}

经验总结扩展阅读