ThreadLocal | 学习笔记

简介: 快速学习 ThreadLocal。

开发者学堂课程【Java 面试疑难点串讲1:面试技巧及语言基础:this 关键字】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/24/detail/494


ThreadLocal


内容介绍

一、ThreadLocal


一、ThreadLocal

在整个 Java 之中引用传递是一个核心的问题,也就是说几乎所有的问题都可能卡在引用传递上。

例如:反射机制里面如果采用反射进行对象实例化,则要求类中要提供有无参构造方法。

如果你没有无参构造,那么就必须明确的传递一个参数(可能是各种类型)。你不得不去面对 Constructor 的操作形式。

范例:问题引出

class Message { //简单Java类,本质在于进行数据的包装

private String info ;

public Message(String info) {

this.info = info ;

}

public String getInfo() {

return info;

}

}

class Send {

public void set(Message msg) { //基础的引用传递

System.out.println(msg.getInfo());

}

}

public class TestDemo {

public static void main(String[] args) {

Message temp = new Message("您吃了么?") ;

new Send( ).set(temp);

}

}

整个过程之中属于一个最基础的引用传递。但是一个新的思考出现了。要求 Send 类中的 set() 方法里面不接收 Message 类对象,但是还要求可以传递 Message
于是有人想到,采用一个中间过渡处理,设置一个 static 属性操作。

class Message { //简单Java类,本质在于进行数据的包装

private String info ;

public Message(String info) {

this.info = info ;

}

public String getInfo( ) {

return info;

}

class Send {

public void set() { //基础的引用传递

Message msg = Factory.message ; //对象怎么来的自己想System.out.println(msg.getInfo());

}

class Factory {

public static Message message ;

public class TestDemo {

public static void main(String[] args) {

Message temp = new Message("您吃了么?") ;//准备对象Factory.message = temp ;

new Send().set();  //发送

}

但是现在一个问题:  java 是多线程了, static 保存的是全局数据区,属于公共的数据处理。但是这种操作在多线程处理中就会出现数据不同步的问题了。那么最好的做法是在可以保存数据基础上再多保存一个当前线程对象。

 p.png

而这种操作就属于 ThreadLocal 类的作用,也就是说 ThreadLocal 在每一次设置内容的时候都会保存有一个当前的线程对象。pp.pngThreadLocal 的操作里面在开发之中保存最多的往往是数据库的连接对象,因为在几乎业务层、数据层也好都可能使用到这种数据库的连接对象,所以将这种对象保存在 ThreadLocal 里面是最合适的。

 

 

 

 

 

相关文章
|
JSON Java 数据格式
springboot后台下载文件报错: Could not find acceptable representation
使用springboot实现从服务器下载文件功能时,报错:Could not find acceptable representation
1744 0
|
6月前
|
人工智能 自然语言处理 监控
LongPort MCP:证券业首个券商MCP,AI赋能智能投资新时代,散户也能玩转机构级交易
LongPort MCP是长桥集团推出的证券行业首个券商模型上下文协议,通过标准化接口实现AI与金融服务的无缝对接,支持自然语言交互的智能投资服务。
726 8
LongPort MCP:证券业首个券商MCP,AI赋能智能投资新时代,散户也能玩转机构级交易
|
12月前
|
人工智能 安全 搜索推荐
双 11、双 12 大促接踵而至,阿里云推出云通信电商零售解决方案
融合多款产品,一站式解决“消息触达”痛点
264 1
|
Python
【Leetcode刷题Python】53. 最大子数组和
LeetCode第53题"最大子数组和"的Python解决方案,利用动态规划的思想,通过一次遍历数组并维护当前最大和以及全局最大和来求解。
265 2
|
8月前
|
机器学习/深度学习 自然语言处理 TensorFlow
解锁 AIGC 工具:入门者到高级达人的终极蜕变手册
解锁 AIGC 工具:入门者到高级达人的终极蜕变手册
|
7月前
|
SQL 关系型数据库 数据库连接
|
11月前
|
消息中间件 存储 监控
ActiveMQ、RocketMQ、RabbitMQ、Kafka 的区别
【10月更文挑战第24天】ActiveMQ、RocketMQ、RabbitMQ 和 Kafka 都有各自的特点和优势,在不同的应用场景中发挥着重要作用。在选择消息队列时,需要根据具体的需求、性能要求、扩展性要求等因素进行综合考虑,选择最适合的消息队列技术。同时,随着技术的不断发展和演进,这些消息队列也在不断地更新和完善,以适应不断变化的应用需求。
687 1
|
监控 Linux 数据库
Linux标准大页设置不合理案例
【8月更文挑战第15天】某企业Linux服务器上部署大型数据库管理系统,为提升性能启用了标准大页(Huge Pages)。但随后出现系统内存使用率不稳定、数据库响应时间延长及频繁内存分配失败等问题。原因是大页数量设置不当、内存分配策略不合适及与其他应用程序冲突。解决方法包括合理计算大页数量、调整内存分配策略和协调不同应用间的关系,确保系统稳定高效运行。
210 5
|
Java Maven
解决Maven中CANNOT Resolve XXX错误
解决Maven中CANNOT Resolve XXX错误
1058 0
|
消息中间件 Shell RocketMQ
就软件研发问题之RocketMQ中ACL授权管理的问题如何解决
就软件研发问题之RocketMQ中ACL授权管理的问题如何解决
189 0