您好,欢迎来到二三四教育网。
搜索
您的当前位置:首页Java并发编程基础-ThreadLocal的使用

Java并发编程基础-ThreadLocal的使用

来源:二三四教育网

章节目录

  • 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());
    }
}

运行结果:


运行结果

Copyright © 2019- how234.cn 版权所有 赣ICP备2023008801号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务