开发者学堂课程【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 保存的是全局数据区,属于公共的数据处理。但是这种操作在多线程处理中就会出现数据不同步的问题了。那么最好的做法是在可以保存数据基础上再多保存一个当前线程对象。
而这种操作就属于 ThreadLocal 类的作用,也就是说 ThreadLocal 在每一次设置内容的时候都会保存有一个当前的线程对象。在 ThreadLocal 的操作里面在开发之中保存最多的往往是数据库的连接对象,因为在几乎业务层、数据层也好都可能使用到这种数据库的连接对象,所以将这种对象保存在 ThreadLocal 里面是最合适的。