ThreadLocal介绍:
- ThreadLLocal变量是为了对象线程安全。是synchronization的另一种选择。
- 每个线程都会有ThreadLocal变量的副本,所以能够提供线程安全。
- 一个线程可以全局访问ThreadLocal变量,表示一个线程中的任何方法都可以访问该变量
- ThreadLocal变量对于一个线程来说是本地,表示一个线程不能访问、修改另一个线程的ThreadLocal变量。
ThreadLocal简单语法:
-
创建变量
private static final ThreadLocal threadLocalVar = new ThreadLocal(); -
设置变量
threadLocalVar.set(“this is a thread local variable”); -
获取变量值
threadLocalVar.get();
ThreadLocal场景:
例如,当客户请求服务时,关联该客户的服务线程存储一个userID或者TransactionID来表示该用户。
代码如下:
package com.fengfengzai.example.thread;
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadLocalExample {
public static void main(String[] args) {
MyThread myThread = new MyThread();
Thread t1 = new Thread(myThread, "t1");
Thread t2 = new Thread(myThread, "t2");
Thread t3 = new Thread(myThread, "t3");
t1.start();
t2.start();
t3.start();
}
}
class MyThread implements Runnable {
@Override
public void run() {
System.out.println("Thread: " + ThreadID.get());
}
}
class ThreadID {
private static AtomicInteger atomicInteger = new AtomicInteger();
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return atomicInteger.incrementAndGet();
}
};
protected static Integer get() {
return threadLocal.get();
}
}
输出如下:
Thread: 1
Thread: 3
Thread: 2
*每次输出结果不同,但是都是输出不同的数值
另外一些使用场景是:
1、使用ThreadLocal来代替synchronization,例如SimpleDateFormat并不是线程安全的,可以使用ThreadLocal为每个线程初始化一个SimpleDateFormat。