ThreadLocal
ThreadLocal是JDK1.2提供的一个工具,它为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,解决共享参数的频繁传递与线程安全等问题
ThreadLocal 模型
案例
//普通Java 类
public class Val <T>{
T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public class ThreadLocalTest01 {
public static HashSet<Val<Integer>> set = new HashSet();
public static ThreadLocal<Val<Integer>> val = ThreadLocal.withInitial(() -> {
Val<Integer> val = new Val<>();
val.setT(0);
//临界区添加锁
addVal(val);
return val;
});
public static ExecutorService THREAD_POOL = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
//10个线程对数据就累加计算
THREAD_POOL.submit(()->add());
//也可以换种写法 new Thread(()->add())
}
THREAD_POOL.shutdown();
read();
//输出结果就是10
System.out.println(sum());
}
synchronized static void addVal(Val val){
set.add(val);
}
public static void add(){
_add();
}
public static void read(){
System.out.println(sum());
}
public static void _add(){
Val<Integer> integerVal = val.get();
integerVal.setT(integerVal.getT() + 1);
}
public static Integer sum(){
return set.stream().map(x->x.getT()).reduce((a,x)->a+x).get();
}
}