如何为ThreadLocal初始化的线程本地数组指定大小?
解决ThreadLocal创建指定大小数组的问题
你遇到的问题很典型——Java里数组的大小并不是类型的一部分,所以int[10]不能作为ThreadLocal的泛型参数,这就是你原来的写法行不通的原因。正确的做法是通过ThreadLocal的初始化逻辑来创建指定大小的数组实例,下面给你两种常用的实现方式:
方式一:重写initialValue()方法
通过匿名内部类重写ThreadLocal的initialValue()方法,在这个方法里返回你想要的指定大小的数组:
class Foo { ThreadLocal<int[]> bar; public Foo() { bar = new ThreadLocal<int[]>() { @Override protected int[] initialValue() { // 在这里指定数组大小为10 return new int[10]; } }; } }
方式二:使用ThreadLocal.withInitial()(Java 8+)
如果你用的是Java 8及以上版本,用Lambda表达式会更简洁:
class Foo { ThreadLocal<int[]> bar = ThreadLocal.withInitial(() -> new int[10]); }
怎么使用这个线程本地数组?
当你需要在当前线程中获取这个数组时,直接调用bar.get()即可,每个线程都会得到自己独立的大小为10的int数组实例:
// 获取当前线程的数组 int[] threadArray = bar.get(); // 给数组赋值 threadArray[0] = 42;
这样每个线程都会拥有自己专属的数组,不会和其他线程的数组产生干扰,完全符合ThreadLocal的线程隔离特性。
内容的提问来源于stack exchange,提问作者Jeroen Maassen
相关产品推荐
相关产品推荐

