关于一段 Java 代码的疑问,求解答

查看 68|回复 3
作者:seedscoder   
我有如下一段 JAVA 代码,为什么 4 次都是输出 0 ?我第一反应应该是递增输出,求大佬们解答
public class DemoApp {
    private static final AtomicInteger nextIndex = new AtomicInteger();
    public static final int VARIABLES_TO_REMOVE_INDEX = nextVariableIndex();
    public static int nextVariableIndex() {
        return nextIndex.getAndIncrement();
    }
    public static void main(String[] args) {
        System.out.println(VARIABLES_TO_REMOVE_INDEX);
        System.out.println(VARIABLES_TO_REMOVE_INDEX);
        System.out.println(VARIABLES_TO_REMOVE_INDEX);
        System.out.println(VARIABLES_TO_REMOVE_INDEX);
    }
}
上面这段代码其实摘抄自 netty InternalThreadLocalMap
public final class InternalThreadLocalMap extends UnpaddedInternalThreadLocalMap {
    private static final ThreadLocal[I] slowThreadLocalMap =
            new ThreadLocal[I]();
   
    private static final AtomicInteger nextIndex = new AtomicInteger();
   
   
    // Internal use only.
    public static final int VARIABLES_TO_REMOVE_INDEX = nextVariableIndex();
   
    private static final int DEFAULT_ARRAY_LIST_INITIAL_CAPACITY = 8;
   
   
        public static int nextVariableIndex() {
        int index = nextIndex.getAndIncrement();
        if (index >= ARRAY_LIST_CAPACITY_MAX_SIZE || index
因为看到网上都说 InternalThreadLocalMap 存储元素的数组 0 号位置是一个类型为 set 的元素,所以对这段代码有点疑惑,那为什么 VARIABLES_TO_REMOVE_INDEX 不直接写 0 ?

int, Static, Final, public

geelaw   
因为直接写 0 不会导致 nextIndex 增加到 1 ?
revers   
nextVariableIndex() 只在赋值的时候使用了一次,所有 VARIABLES_TO_REMOVE_INDEX 值为 0 ,但是 nextIndex 值变为了 1
seedscoder
OP
  
@geelaw 我看网上大佬的源码分析文章,都是说数组 0 号位置元素的类型是 set ,看起来不需要增加 1 ;
另外我问了一下 ChatGPT ,它的回答:
```
VARIABLES_TO_REMOVE_INDEX 被定义为一个常量,其实质上是在类加载的时候通过 nextVariableIndex() 方法获取的值。在 Java 中,类加载时会执行静态代码块,这个时候 nextVariableIndex() 方法被调用,得到的结果会被赋值给 VARIABLES_TO_REMOVE_INDEX 。由于 VARIABLES_TO_REMOVE_INDEX 是一个 final 常量,它的值在类加载后就不会发生变化。
这样设计的一个优势是,在运行时获取这个值只需要一次计算,而不必每次调用的时候都重新计算。这有助于提高性能,特别是在需要频繁访问这个索引的情况下。
所以,尽管 nextVariableIndex() 方法被调用,但由于其结果在类加载时就确定了,并且是不可变的,因此被定义为一个常量。这样做的目的是为了提高效率,同时保证这个值在运行时是不可变的。
```
那反正只运行一次,跟直接写 0 好像没多大区别?
您需要登录后才可以回帖 登录 | 立即注册

返回顶部