package Local;
/**
* 本例子主要是测试ThreadLocal,其实ThreadLoacl内部非常的简单,主要是内部维护一个ThreadLocalMap,为什么要自己维护一个ThreadLocalMap呢?
*而使用HashMap, 因为ThreadLocalMap里面得Entry是WeakReference(弱引用)的,便于垃圾回收。
* ThreadLocal 中 的Map 以Thread.currentThread 为key
*
* @author Administrator
*
*/
public class ThreadLocalTest {
public static void main(String[] args) {
// 模拟HttpServlent 单例
UserServlet servlent = new UserServlet();
// 模拟10线程登录,访问HttpServlent
for (int i = 0; i < 10; i++) {
new UserLoginThread(servlent, new User("User " + i)).start();
}
}
}
/**
* 模拟一个线程登录
* @author Administrator
*
*/
class UserLoginThread extends Thread {
UserServlet userServlent;
User user;
public UserLoginThread(UserServlet userServlent, User user) {
super();
this.userServlent = userServlent;
this.user = user;
}
public void run() {
super.run();
userServlent.doPost(user);
}
}
/**
* 模拟HttpServlent 登录
*
* @author Administrator
*
*/
class UserServlet {
MyService service = new MyService();
public void doPost(User user) {
UserContext.login(user);
work();
}
public void work() {
/**
* 这里可能调用其他的Service,Service类里面只要没有开其他线程,那么如果要使用当前登录的User都可以使用UserContext
* .getUser() 方法来获取User,好处是不需要处处传递User
*/
service.printlnUser();
}
}
class MyService {
public void printlnUser() {
System.out.println(Thread.currentThread().getName() + " "
+ UserContext.getUser().getName());
}
}
/**
* User上下文
*
* @author Administrator
*
*/
class UserContext {
static ThreadLocal<User> context = new ThreadLocal<User>();
public static void login(User user) {
context.set(user);
}
public static User getUser() {
return context.get();
}
}
/**
* 用户
*
* @author Administrator
*
*/
class User {
private String name;
public User(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
分享到:
相关推荐
另外,它也可以用于HTTP请求上下文,存储请求相关的数据,如用户会话信息,避免在方法之间传递参数。 然而,ThreadLocal并不是万能的解决方案,它有一些潜在的问题需要注意: - 内存泄漏:如果线程长时间存活,或者...
2. **请求上下文**:在Web应用中,可以使用`ThreadLocal`保存HttpServletRequest或Session对象,方便在同一个请求处理链路中访问。 3. **线程状态**:记录线程执行过程中的状态,例如事务管理、计数器等。 然而,...
2. 存放上下文变量:如WebWork的ActionContext,它可以保存请求处理过程中的各种上下文信息,如动作对象、请求参数等。 3. 存储数据库会话:在Spring Hibernate ORM中,ThreadLocal常用来保存数据库连接的Session,...
这种设计使得在同一个线程内的所有数据库操作都可以访问到相同的事务上下文,无需手动传递。 例如,在Spring的`DataSourceTransactionManager`中,它会创建一个`TransactionInfo`对象,该对象包含了事务的相关信息...
- **请求上下文传播**:在Web开发中,可以将HttpServletRequest对象放入ThreadLocal,以便在同一个请求处理过程中方便地访问请求信息。 - **缓存**:在某些场景下,可以为每个线程提供一个本地缓存,避免了多线程...
ThreadLocal 可以用来存储这些信息,保证每个任务在自己的线程内拥有独立的上下文。 2. **避免并发冲突**:如果一个任务在执行过程中需要使用一些共享资源,但又不希望引入锁或同步机制,可以考虑使用 ThreadLocal ...
1. **线程上下文**: `ThreadLocal`常用于存储线程上下文信息,如数据库连接、事务ID、用户会话信息等。这些信息在每个线程内独立,不需同步。 2. **缓存**: 小型的线程局部缓存可以避免频繁的全局访问,提高性能。 ...
此外,ThreadLocal还有其他应用场景,比如在Web开发中,可以用来存储请求相关的上下文信息,如用户会话、线程安全的计数器等,避免在多线程环境中的数据污染问题。 总之,ThreadLocal是Java多线程编程中的一种有效...
ThreadLocal常用于保存线程上下文信息,如用户Session、数据库连接、事务ID等,确保这些信息只在当前线程内有效。 2. **避免同步:** 如果多个线程需要访问相同的数据,但是每个线程都需要自己的副本,...
设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。这些模式在多次使用后被广泛认可,成为了经验丰富的开发者之间的一种通用语言。本资料主要聚焦于两种设计模式以及Java中的ThreadLocal...
- **HTTP请求上下文**:在Web应用中,可以利用ThreadLocal传递请求相关的数据,如用户会话信息、请求参数等。 - **线程本地缓存**:为每个线程提供独立的缓存,避免并发访问引起的同步问题。 - **日志记录器**:在...
ThreadLocal通常用于在多线程环境下为每个线程提供一个单独的实例,比如作为线程上下文的存储。 **ThreadLocal内部结构** ThreadLocal的工作原理基于Java的Thread类。在ThreadLocal中,每个实例都有一个内部Map,...
这种方式在高并发的微服务架构中尤为常见,每个请求由独立的线程处理,每个线程都有自己的事务上下文。 在具体实践中,开发者需要根据业务场景合理选择事务管理方式和ThreadLocal的使用,以保证系统的性能和数据...
- 请求上下文:在Web应用中,可以使用ThreadLocal存储HttpServletRequest、Session等与请求相关的数据,确保这些数据只在当前请求的线程内可见。 - 数据库连接:在数据库连接池中,可以使用ThreadLocal为每个线程...
在实际开发中,ThreadLocal常用于缓存线程相关的数据,如数据库连接、事务管理、请求上下文等。例如,数据库连接池通常会提供一个ThreadLocal的静态变量,使得每个线程都能快速获取到专属的数据库连接,提高并发性能...
3. **日志记录**:在多线程环境中,`ThreadLocal`可以用于维护每个线程的日志上下文,如线程ID、用户名等,便于日志信息的记录和分析。 4. **性能优化**:在某些计算密集型应用中,`ThreadLocal`可以用于缓存线程...
通过ThreadLocal,可以保证这些信息在Action的不同调用中保持一致,即在同一个请求的不同阶段中,即使使用不同的线程去处理,它们依然能访问到相同的上下文信息。 黄老邪,作为京东的资深架构师,拥有近20年的行业...
3. 线程上下文:ThreadLocal 可以用于存储线程上下文信息,如当前用户、当前订单等。 ThreadLocal 的实现 ThreadLocal 的实现是基于 Java 语言的弱引用机制。每个线程都持有一个隐式的引用到其 ThreadLocal 变量...