在了解ThreadLocal之前,一定要确定一个概念:ThreadLocal不是用来解决共享对象的多线程访问问题的
那么ThreadLocal在多线程的作用是什么呢?从下面几个方面来了解
ThreadLocal的作用
ThreadLocal可以理解为:线程局部变量, 是每一个线程所单独持有的。其他线程不能对其进行访问, 通常是类中的 private static 字段,是对该字段初始值的一个拷贝,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联,
在并发编程的时候,成员变量如果不做任何处理其实是线程不安全的,各个线程都在操作同一个变量,显然是不行的,并且我们也知道volatile这个关键字也是不能保证线程安全的。当然我们可以使用synchorinized 关键字来为此变量加锁,进行同步处理,从而限制只能有一个线程来使用此变量,但是加锁会大大影响程序执行效率,此外我们还可以使用ThreadLocal来解决对某一个变量的访问冲突问题。
当使用ThreadLocal维护变量的时候 为每一个使用该变量的线程提供一个独立的变量副本,即每个线程内部都会有一个该变量,这样同时多个线程访问该变量并不会彼此相互影响,因此他们使用的都是自己从内存中拷贝过来的变量的副本, 这样就不存在线程安全问题,也不会影响程序的执行性能。
深入了解ThreadLocal使用
先不去分析源码,仅仅写个例子,根据例子学习ThreadLocal的简单使用。
public class ThreadTest {
//定义一个全局ThreadLocal
public static ThreadLocal<String> locals= new ThreadLocal<String>();
//开启三个线程
public void threadLocalTest(){
ThreadLocalTest test1 = new ThreadLocalTest("AA");
ThreadLocalTest test2 = new ThreadLocalTest("BB");
ThreadLocalTest test3 = new ThreadLocalTest("CC");
test1.start();
test2.start();
test3.start();
}
}
在线程里往ThreadLocal塞值,再打印出
public class ThreadLocalTest extends Thread {
private int a = 5;
public ThreadLocalTest(String name) {
super(name);
}
@Override
public void run() {
super.run();
try {
for (int i = 0; i < 5; i++) {
a += 1;
ThreadTest.locals.set(a + "");
Log.e(this.getName(), "value =&#