带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(9)

简介: 带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(9)

带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(8)https://developer.aliyun.com/article/1340061?groupCode=taobaotech


image.png鹰眼上下文参数传递

 

/**
  * 在主线程中,开启鹰眼异步模式,并将ctx传递给多线程任务3 **/
// 防止鹰眼链路丢失,需要传递
RpcContext_inner ctx = EagleEye.getRpcContext();
// 开启异步模式
ctx.setAsyncMode(true); 8
/**
* 在线程池任务线程中,设置鹰眼rpc环境
**/
private void runTask() { try {
EagleEye.setRpcContext(ctx);
// do something...
} catch (Exception e) {
log.error("requestError, params: {}", this.params, e);
} finally {
// 判断当前任务是否是主线程在运行,当Rejected策略为CallerRunsPolicy的时候,核对当前线程if (mainThread != Thread.currentThread()) {
EagleEye.clearRpcContext();
}
}
}


ThreadLocal线程变量概述

什么是ThreadLocal

 

ThreadLocal类提供了线程本地变量(thread-local variables),这些变量不同于普通的变量,访问线程本地变量的每个线程(通过其get或set方法)都有其自己的独立初始化的变量副本,因此ThreadLocal没有多线程竞争的问题,不需要单独进行加锁。

 

ThreadLocal使用场景

 

  1. 每个线程都需要有属于自己的实例数据(线程隔离);
  2. 框架跨层数据的传递;
  3. 需要参数全局传递的复杂调用链路的场景;
  4. 数据库连接的管理,在AOP的各种嵌套调用中保证事务的一致性;

 

 

ThreadLocal的原理与实践

 

对于ThreadLocal而言,常用的方法有get/set/initialValue 3个方法。

 

众所周知,在java中SimpleDateFormat有线程安全问题,为了安全地使用SimpleDateFormat,除了1)创建SimpleDateFormat局部变量;和2)加同步锁 两种方案外,我们还可以使用3)ThreadLocal的方案:

  /**
  * 使用 ThreadLocal 定义一个全局的 SimpleDateFormat 3 */
private static ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new
ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 9 }
  };
// 用法
String dateString = simpleDateFormatThreadLocal.get().format(calendar.getTime());

 

 

带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(10)https://developer.aliyun.com/article/1340059?groupCode=taobaotech

相关文章
|
23天前
|
安全 Java 调度
Java语言多线程编程技术深度解析
Java语言多线程编程技术深度解析
291 1
|
24天前
|
缓存 监控 安全
Java的线程池和线程安全
Java的线程池和线程安全
|
4天前
|
Java
【技术瑜伽师】Java 线程:修炼生命周期的平衡之道,达到多线程编程的最高境界!
【6月更文挑战第19天】Java多线程编程犹如瑜伽修行,从创建线程开始,如`new Thread(Runnable)`,到启动线程的活跃,用`start()`赋予生命。面对竞争与冲突,借助同步机制保证资源访问的有序,如`synchronized`关键字。线程可能阻塞等待,如同瑜伽的静止与耐心。完成任务后线程终止,整个过程需密切关注状态变换,以求多线程间的和谐与平衡。持续修炼,如同瑜伽般持之以恒,实现高效稳定的多线程程序。
|
4天前
|
Java 开发者
【技术成长日记】Java 线程的自我修养:从新手到大师的生命周期修炼手册!
【6月更文挑战第19天】Java线程之旅,从新手到大师的进阶之路:始于创建线程的懵懂,理解就绪与运行状态的成长,克服同步难题的进阶,至洞悉生命周期的精通。通过实例,展示线程的创建、运行与同步,展现技能的不断提升与升华。
|
4天前
|
Java
【技术解码】Java线程的五味人生:新建、就绪、运行、阻塞与死亡的哲学解读!
【6月更文挑战第19天】Java线程生命周期如同人生旅程,经历新建、就绪、运行、阻塞至死亡五阶段。从`new Thread()`的诞生到`start()`的蓄势待发,再到`run()`的全力以赴,线程在代码中奔跑。阻塞时面临挑战,等待资源释放,最终通过`join()`或中断结束生命。线程的每个状态转变,都是编程世界与哲思的交汇点。
|
20天前
|
开发框架 监控 Java
【.NET Core】多线程之线程池(ThreadPool)详解(二)
【.NET Core】多线程之线程池(ThreadPool)详解(二)
31 3
|
20天前
|
SQL 开发框架 Java
【.NET Core】多线程之线程池(ThreadPool)详解(一)
【.NET Core】多线程之线程池(ThreadPool)详解(一)
24 2
|
23天前
|
安全 Java
JAVA语言中的多线程编程技术
JAVA语言中的多线程编程技术
|
23天前
|
存储 安全 Java
Java语言中的多线程编程技术深入解析
Java语言中的多线程编程技术深入解析
221 1
|
26天前
|
设计模式 安全 Java
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)

热门文章

最新文章