Java并发编程基础-ThreadLocal的使用
2018-05-20 本文已影响23人
markfork
章节目录
- ThreadLocal 简介
- ThreadLocal 使用
1.ThreadLocal 简介
什么是ThreadLocal
ThreadLocal 为线程变量,是一个以ThreadLocal对象为key,任意对象为值的存储
结构,这个结构被附带到线程上。
ThreadLocal的作用
通过set(T)来设置一个值,在当前线程下通过get()方法获取到原先设置的值。
2.ThreadLocal 使用
- 题目:设计一个方案统计每个接口的响应时间
- 思路:
- 采用AOP(面向切面编程),可以在方法调用前的切入点执行begin()方法,在方法调用后的切入点执行end()方法。
- 每个请求本质上是线程执行的过程,那么问题就变为统计每个线程执行过程的耗时。
- 采用工具类+实力方式会产生过多工具类对象
- 采用静态方法方式,如果不同步共享变量会产生并发获取系统时间的问题,统计不准确。
- 采用同步方式统计接口响应时间,接口性能会下降。
- 那么有没有一种方式是将不通接口响应时间值绑定到 不同线程上的方式,并且获取方法一致,但是时间值是每个线程特定可见的,答案就是使用ThreadLocal
Profiler
begin() 获取接口执行时间点、end()获取从begin()方法调用开始到end()方法被调用时的时间差,单位毫秒。
package org.seckill.Thread;
public class Profiler {
private static final ThreadLocal<Long> TIME_THREADLOCAL = new ThreadLocal<Long>(){
//第一次get()方法调用时会进行初始化,这个是在set()方法没有被调用的情况下发生,每个线程调用一次
protected Long initialValue() {
return System.currentTimeMillis();
}
};
//设置初始运行时刻
public static final void begin(){
TIME_THREADLOCAL.set(System.currentTimeMillis());
}
public static final long end(){
return System.currentTimeMillis()- TIME_THREADLOCAL.get();
}
public static void main(String[] args) {
Profiler.begin();
Interrupted.SleepUnit.second(1);
System.out.println("cost time "+Profiler.end());
}
}
运行结果:
运行结果