java多线程中ThreadLocal的相关知识

本小妞迷上赌 提交于 2019-11-29 12:06:16

ThreadLocal

ThreadLocal会为每一个调用它的线程创建一个变量副本,每个线程使用自己的副本并对其进行操作,不会影响到其他的线程的变量副本的值。

方法:

  • set:设置该线程ThreadLocal副本中的值
  • get:获取该线程ThreadLocal副本中的值
  • initialValue:可以在创建ThreadLocal时重写该方法,设置初值。
  • withInitial:设置ThreadLocal的初值。
ThreadLocal local = new ThreadLocal<>(){
	protected Integer initialValue(){
		return 200;
	}
}

ThreadLocal local = ThreadLocal.withInitial(()->200);

例子

public class test{
	private static ThreadLocal<Integer> threadlocal = new ThreadLocal<>();
	public static void main(String[] args){
		//设置mian线程中ThreadLocal的值
		threadlocal.set(2);
		System.out.println(Thread.currentThread().getName()+"->"+thraedlocal.get());

		//开启新线程
		new Thread(()->{
			//设置新线程线程中ThreadLocal的值
			threadlocal.set(200);
			System.out.println(Thread.currentThread().getName()+"->"+thraedlocal.get());
		}

		System.out.println(Thread.currentThread().getName()+"->"+thraedlocal.get());
	}
}

输出:main->2
     Thread-0->200
     main->2

InheritableThreadLocal

在线程中创建的子线程的InheritableThreadLocal的值和创建它的父线程的值相同。即在父线程中创建子线程时,会把父线程的InheritableThreadLocal拷贝一份给子线程。

public class test{
	private static ThreadLocal<Integer> threadlocal = new InheritableThreadLocal<>();
	public static void main(String[] args){
		//设置mian线程中InheritableThreadLocal的值
		threadlocal.set(2);
		System.out.println(Thread.currentThread().getName()+"->"+thraedlocal.get());

		//线程由main线程开启(继承mian线程中InheritableThreadLocal的值)
		new Thread(()->{
			System.out.println(Thread.currentThread().getName()+"->"+thraedlocal.get());
		}
	}
}

输出:  main->2
       Thread-0->2
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!