39 多线程(十一)——ThreadLocal

目前阶段,我只能知其然,不能做到知其所以然,这里引用一篇其所以然的文章,为以后理解ThreadLocal做准备: https://www.cnblogs.com/ldq2016/p/9041856.html

我把它大概理解为:一个线程模型,这个模型下的线程都共享这个模型下的一个泛型引用变量,但各线程各自的变量值是不同的,因为各线程各自的变量只是模型下的那个变量的副本。

ThreadLocal搭建要点:

  1. ThreadLocal要作为一个public static 的公共属性被声明和初始化在类中,(声明和初始化有三种方法)
  2. 该类中需要写一个内部类线程类(实现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());
		}
	}
}

  

原文地址:https://www.cnblogs.com/Scorpicat/p/12010332.html