ThreadLocal
1.线程安全的解决方案
- 1.加锁(synchronized 、Lock:加锁可以解决线程安全的问题,但因为排队处理,所以会带来一定的性能消耗)
- 2.设置私有变量
有没有一种方案既可以避免加锁排队执行,又不会每次执行任务都需要重新创建私有变量呢?
答:有。ThreadLocal线程的本地变量,每个线程创建一个私有变量(以1000个任务10个线程池的实例来说,使用ThreadLocal就是创建10个SimpleDateFormat对象)。
(1)选择ThreadLocal还是锁?
- 就要看创建实例对象之后的复用率,复用率高就使用ThreadLocal。
- 如:实现1000个任务的时间格式化。–>线程池、SimpleDateFormat(全局)—>线程不安全的问题
(2)ThreadLocal的使用方法
- 1.set(): 将私有变量设置到线程。(给线程中存线程变量的)
- 2.get(): 获取线程中的私有变量。
- 3.remove(): 将私有变量从线程中移除。
public class ThreadPoolDemo {
private static ThreadLocal<SimpleDateFormat> threadLocal=new ThreadLocal<>();
public static void main(String[] args) {
//设置私有变量
threadLocal.set(new SimpleDateFormat("mm:ss"));
//得到ThreadLocal
SimpleDateFormat simpleDateFormat=threadLocal.get();
Date date=new Date(1000);
String result=simpleDateFormat.format(date);
System.out.println("时间:"+result);
}
}
//创建线程私有变量
private static ThreadLocal<String> threadLocal=new ThreadLocal<>();
public static void main(String[] args) {
//定义公共任务
Runnable runnable=new Runnable()