《Java工程师必读手册》——Java编程技巧系列——Java编程技巧之数据结构(2)

简介: 《Java工程师必读手册》——Java编程技巧系列——Java编程技巧之数据结构(2)

接上篇:https://developer.aliyun.com/article/1228152?spm=a2c6h.13148508.setting.25.21084f0eNCKPti


三、 使用ThreadLocal存储线程专有对象

 

ThreadLocal提供了线程专有对象,可以在整个线程生命周期中随时取用,极大地方便了一些逻辑的实现。

 

常见的ThreadLocal用法主要有两种:

 

保存线程上下文对象,避免多层级参数传递;

保存非线程安全对象,避免多线程并发调用。

 

1. 保存线程上下文对象,避免多层级参数传递

 

这里,以PageHelper插件的源代码中的分页参数设置与使用为例说明。

 

1) 设置分页参数代码

 

image.png

 

 

 

2) 使用分页参数代码

 

image.png

 

3) 使用分页插件代码

 

image.png 

 

如果要把分页参数通过函数参数逐级传给查询语句,除非修改MyBatis相关接口函数,否则是不可能实现的。

 

2. 保存非线程安全对象,避免多线程并发调用

 

在写日期格式化工具函数时,首先想到的写法如下:

 

image.png 

 

其中,每次调用都要初始化DateFormat导致性能较低,把DateFormat定义成常量后的写法如下:

 

image.png 

 

由于SimpleDateFormat是非线程安全的,当多线程同时调用formatDate函数时,会导致返回结果与预期不一致。如果采用ThreadLocal定义线程专有对象,优化后的代码如下:

 

image.png 

 

这是在没有线程安全的日期格式化工具类之前的实现方法。在JDK8以后,建议使用DateTimeFormatter代替SimpleDateFormat,因为SimpleDateFormat是线程不安全的,而DateTimeFormatter是线程安全的。当然,也可以采用第三方提供的线程安全日期格式化函数,比如apache的DateFormatUtils工具类。

 

注意

ThreadLocal有一定的内存泄露的风险,尽量在业务代码结束前调用remove函数进行数据清除。


 接下篇:https://developer.aliyun.com/article/1228148?groupCode=java

相关文章
|
7天前
|
存储 Java
Java数据结构:链表
Java数据结构:链表
19 2
|
7天前
|
算法 Java
Java数据结构——队列
Java数据结构——队列
22 4
|
7天前
|
Java 索引
Java数据结构——栈
Java数据结构——栈
19 1
|
7天前
|
Java
DAY-1 | Java数据结构之链表:删除无头单链表中等于给定值 val 的所有节点
力扣203题解:使用时间复杂度为O(n)的思路删除链表中所有值为key的元素。引入辅助指针pre,记录cur的前一个节点,遍历链表时,若cur.val!=key,pre和cur同时前进;若cur.val==key,则pre.next=cur.next,cur继续前进,确保pre不急于跟随以处理连续相同值的情况。遍历结束后,处理头节点可能需要删除的特殊情况。
19 0
|
10天前
|
算法 搜索推荐 Java
Java数据结构 -- 常见算法分析(查找算法、排序算法)精解详解!!!
Java数据结构 -- 常见算法分析(查找算法、排序算法)精解详解!!!
7 0
|
3天前
|
Java 开发者 UED
掌握Java多线程编程:从基础到高级
【5月更文挑战第31天】本文深入探讨了Java多线程编程的核心概念,包括线程的创建、生命周期、同步机制以及高级并发工具。通过实际示例和代码片段,读者将学会如何有效地管理和协调线程,以编写高效且稳定的并发应用程序。
|
3天前
|
安全 Java 调度
Java语言多线程编程技术深度解析
Java语言多线程编程技术深度解析
|
3天前
|
存储 安全 Java
深入理解Java并发编程:线程安全与锁机制
【5月更文挑战第31天】在Java并发编程中,线程安全和锁机制是两个核心概念。本文将深入探讨这两个概念,包括它们的定义、实现方式以及在实际开发中的应用。通过对线程安全和锁机制的深入理解,可以帮助我们更好地解决并发编程中的问题,提高程序的性能和稳定性。
|
4天前
|
缓存 监控 安全
Java的线程池和线程安全
Java的线程池和线程安全