ThreadLocal
如果线程都调用同一个类的数据,会导致数据错误,ThreadLocal用来提供线程内部的共享变量,在多线程环境下,可以保证各个线程之间的变量互相隔离、相互独立。
如果有一个类的某个变量会被不同的进程调用,就必须将这个变量设置成ThreadLocal类型
ThreadLocal一般会加泛型,实例化对象一般有两种方:
第一种方式变量的初始值为null,第二种方式可以给设置的变量赋初始值
static ThreadLocal<Integer> variable = new ThreadLocal<Integer>();
static ThreadLocal<Integer> variable = new ThreadLocal<Integer>(){ @Override protected Integer initialValue() { return 1; } };
常用的方法有四个:
T=initialValue() 返回此线程局部变量的当前线程的“初始值”。一般不调用set方法第一次调用get的方法的时候回自动调用活得初始值,二般是调用remove以后第一次调用get的时候。
T=get() 返回当前线程的此线程局部变量副本中的值
void=set() 将此线程局部变量设置为指定值
void=remove() 删除此线程局部变量的当前线程值。
public class TortoiseRun extends Thread { // static ThreadLocal<Integer> step = new ThreadLocal<Integer>(); static ThreadLocal<Integer> step = new ThreadLocal<Integer>(){ @Override protected Integer initialValue() { return 1; } }; public TortoiseRun(){}; public TortoiseRun(String name){ super(name); }; @Override public void run(){ for (int i = 1; i <10; i++) { try { Thread.currentThread().sleep(1000); step.set(i); System.out.println(Thread.currentThread().getName()+"走了"+step.get()); } catch (InterruptedException e) { e.printStackTrace(); } } } }
public class TestMain { public static void main(String[] args) { TortoiseRun tortoiserun1=new TortoiseRun("乌龟1"); TortoiseRun tortoiserun2=new TortoiseRun("乌龟2"); tortoiserun1.start(); try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } tortoiserun2.start(); } }