原文网址:Java多线程--ThreadLocal的用法(有实例)_IT利刃出鞘的博客-CSDN博客
简介
本文用示例来介绍Java中ThreadLocal的用法。
方法
方法 | 作用 | 说明 |
void set(T value) | 设置值 | 设置线程中本地变量xxx的值 |
T get() | 获取值 | 获取线程中本地变量xxx的值 |
void remove() | 删除 | 用完ThreadLocal后要调用此方法,不然可能导致内存泄露。 |
实例
单个变量
package com.example.a;
public class Demo {
private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
static void print(String str){
System.out.println(str + ":" + threadLocal.get());
}
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
threadLocal.set("abc");
print("thread1 variable");
// 必须要清除,否则可能导致内存泄露
threadLocal.remove();
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
threadLocal.set("def");
print("thread2 variable");
// 必须要清除,否则可能导致内存泄露
threadLocal.remove();
}
});
thread1.start();
thread2.start();
}
}
运行结果
thread1 variable:abc
thread2 variable:def
多个变量
package com.example.a;
public class Demo {
private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
private static ThreadLocal<String> threadLocal2 = new ThreadLocal<>();
static void print(String str){
System.out.println(str + ":" + threadLocal.get());
System.out.println(str + ":" + threadLocal2.get());
}
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
threadLocal.set("abc");
threadLocal2.set("abc2");
print("thread1 variable");
// 必须要清除,否则可能导致内存泄露
threadLocal.remove();
threadLocal2.remove();
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
threadLocal.set("def");
threadLocal2.set("def2");
print("thread2 variable");
// 必须要清除,否则可能导致内存泄露
threadLocal.remove();
threadLocal2.remove();
}
});
thread1.start();
thread2.start();
}
}
运行结果
thread1 variable:abc
thread1 variable:abc2
thread2 variable:def
thread2 variable:def2
实际场景
Web项目当前请求的用户信息
见:SpringBoot--使用ThreadLocal保存每次请求的用户信息_springboot threadlocal保存用户信息_IT利刃出鞘的博客-CSDN博客
数据库连接
public Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
public static Connection getConnection() {
return connectionHolder.get();
}
Session管理
public static Session getSession() throws InfrastructureException {
Session s = (Session) threadSession.get();
try {
if (s == null) {
s = getSessionFactory().openSession();
threadSession.set(s);
}
} catch (HibernateException ex) {
throw new InfrastructureException(ex);
}
return s;
}