ThreadLocal
1.Threadlocal能够保证一个变量能够在多线程环境下保持互不影响,主要原理是,每一个线程都有自己的内存空间。而ThreadLocal为每一个线程分配一个变量副本,保存在线程自己的内存空。当线程销毁时,变量副本也会跟着被回收。
package com.test.util;
public class Test {
public static void main(String[] args) {
//初始化一个对象,供4个线程同时访问。
MyCount myCount=new MyCount();
Thread t1=new MyThread(myCount);
Thread t2=new MyThread(myCount);
Thread t3=new MyThread(myCount);
Thread t4=new MyThread(myCount);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class MyCount{
//设置初始值为11.
public static ThreadLocal<Integer> count=new ThreadLocal<Integer>(){
protected Integer initialValue() {
return 11;
};
};
//获取下一个数,增加1.
public int nextValue(){
count.set(count.get()+1);
return count.get();
}
}
class MyThread extends Thread{
private MyCount count;
public MyThread(MyCount count) {
this.count=count;
}
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+":"+count.nextValue());
}
}
}
结果:
Thread-0:12
Thread-0:13
Thread-0:14
Thread-0:15
Thread-0:16
Thread-0:17
Thread-0:18
Thread-0:19
Thread-1:12
Thread-1:13
Thread-1:14
Thread-1:15
Thread-1:16
Thread-1:17
Thread-1:18
Thread-1:19
Thread-1:20
Thread-1:21
Thread-0:20
Thread-0:21
Thread-2:12
Thread-2:13
Thread-2:14
Thread-2:15
Thread-2:16
Thread-2:17
Thread-2:18
Thread-2:19
Thread-2:20
Thread-2:21
Thread-3:12
Thread-3:13
Thread-3:14
Thread-3:15
Thread-3:16
Thread-3:17
Thread-3:18
Thread-3:19
Thread-3:20
Thread-3:21
2.主要常用的方法
set();设置值
get();获取值
initValue()初始化值
而且ThreadLocal支持泛型。