39 多线程(十一)——ThreadLocal
目前阶段,我只能知其然,不能做到知其所以然,这里引用一篇其所以然的文章,为以后理解ThreadLocal做准备: https://www.cnblogs.com/ldq2016/p/9041856.html
我把它大概理解为:一个线程模型,这个模型下的线程都共享这个模型下的一个泛型引用变量,但各线程各自的变量值是不同的,因为各线程各自的变量只是模型下的那个变量的副本。
ThreadLocal搭建要点:
- ThreadLocal要作为一个public static 的公共属性被声明和初始化在类中,(声明和初始化有三种方法)
- 该类中需要写一个内部类线程类(实现Runnable或继承Thread)
Demo:
package _20191209; public class ThreadLocalTest { //创建本地线程区域 //private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>(); //创建并初始化线程局部变量 // private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() { // protected Integer initialValue() { // return 200;//值的类型是泛型指定的类型 // } // }; //以上两步甚至还可以简化为lamda形式 private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(()->200); public static void main(String[] args) { System.out.println(Thread.currentThread().getName()+"-->预设值:"+threadLocal.get()); //虽然两个线程都是使用同一个threadLocal,但它们内部各自的值是不相同的(运行输出查看) new Thread(new MyThread()).start(); new Thread(new MyThread()).start(); } //写一个内部类 public static class MyThread implements Runnable{ @Override public void run() { //虽然多个线程都是使用同一个threadLocal,但它们内部各自的值是不相同的(运行输出查看) threadLocal.set((int)(Math.random()*99)); System.out.println(Thread.currentThread().getName()+"-->"+threadLocal.get()); } } }