ThreaLocalUtil工具类
时间: 2025-08-23 19:57:46 浏览: 5
### ThreadLocalUtil 工具类使用示例
在 Java 多线程编程中,`ThreadLocal` 被广泛用于实现线程本地存储,以避免线程间的数据共享冲突。以下是一个实用的 `ThreadLocalUtil` 工具类示例,可用于简化 `ThreadLocal` 的使用,并在实际项目中提供良好的封装性。
#### 示例代码
以下是一个通用的 `ThreadLocalUtil` 工具类实现,支持泛型存储和线程安全访问:
```java
/**
* 通用 ThreadLocal 工具类
*/
public class ThreadLocalUtil<T> {
private final ThreadLocal<T> threadLocal = new ThreadLocal<>();
/**
* 设置值
*/
public void set(T value) {
threadLocal.set(value);
}
/**
* 获取值
*/
public T get() {
return threadLocal.get();
}
/**
* 清除当前线程中的值
*/
public void remove() {
threadLocal.remove();
}
}
```
#### 使用示例
以下是一个具体的使用场景示例,展示了如何通过 `ThreadLocalUtil` 在不同线程中存储和访问用户信息:
```java
public class ThreadLocalExample {
// 创建一个 ThreadLocalUtil 实例
private static final ThreadLocalUtil<String> userContext = new ThreadLocalUtil<>();
public static void main(String[] args) {
// 线程1
new Thread(() -> {
userContext.set("Alice");
System.out.println("Thread 1 - User: " + userContext.get());
userContext.remove();
}).start();
// 线程2
new Thread(() -> {
userContext.set("Bob");
System.out.println("Thread 2 - User: " + userContext.get());
userContext.remove();
}).start();
}
}
```
**输出示例**:
```
Thread 1 - User: Alice
Thread 2 - User: Bob
```
在这个示例中,`ThreadLocalUtil` 为每个线程维护了独立的用户信息副本,互不干扰。线程 1 设置了 `"Alice"`,而线程 2 设置了 `"Bob"`,两者独立访问各自的值,避免了线程安全问题。
#### 线程池中的注意事项
在使用线程池时,由于线程可能被复用,`ThreadLocal` 的值可能会残留到下一个任务中。因此,务必在任务执行结束后调用 `remove()` 方法清除线程本地数据,防止内存泄漏和数据污染。
```java
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(() -> {
try {
userContext.set("User1");
System.out.println("Task 1 - User: " + userContext.get());
} finally {
userContext.remove();
}
});
executorService.submit(() -> {
try {
userContext.set("User2");
System.out.println("Task 2 - User: " + userContext.get());
} finally {
userContext.remove();
}
});
```
#### 结合 Spring Boot 使用
在 Spring Boot 项目中,`ThreadLocal` 常用于保存请求上下文信息,例如用户登录状态、请求 ID 等。可以通过自定义拦截器或 AOP 切面来设置和清理 `ThreadLocal` 数据,确保线程安全。
```java
@Component
public class UserContext {
private static final ThreadLocal<String> currentUser = new ThreadLocal<>();
public void setCurrentUser(String user) {
currentUser.set(user);
}
public String getCurrentUser() {
return currentUser.get();
}
public void clear() {
currentUser.remove();
}
}
```
在拦截器中设置当前用户:
```java
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String user = request.getHeader("X-User");
userContext.setCurrentUser(user);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
userContext.clear();
}
```
#### 总结
`ThreadLocalUtil` 工具类在多线程环境中提供了线程隔离的数据存储机制,适用于日志追踪、事务上下文管理、用户身份识别等场景。合理使用 `ThreadLocal` 并结合适当的清理机制,可以有效提升程序的并发安全性和可维护性[^2]。
阅读全文
相关推荐












