美文网首页
Java并发编程基础-ThreadLocal的使用

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

作者: markfork | 来源:发表于2018-05-20 11:19 被阅读23次

    章节目录

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

    运行结果:


    运行结果

    相关文章

      网友评论

          本文标题:Java并发编程基础-ThreadLocal的使用

          本文链接:https://www.haomeiwen.com/subject/ziizdftx.html