自从碰到N多个性能问题后,看是注意使用ThreadLocal的使用,本章只是体现如何使用ThreadLocal,ThreadLocal在性能方面的提高以及在内存分配方面的优势不再讨论范围内。
ThreadLocal的扼要
一个线程有它独立的流程的stack,在web的应用容器中都有Thread Pool,因为线程的创建都是重量级的消耗。
weblogic、glassfish、jboss都是允许你调解Pool。
需要了解ThreadLocal,那先假设我们自己订制一个简单的ThreadLocal
import java.util.HashMap; import java.util.Map; public class CustomThreadLocal { private static Map threadMap = new HashMap(); public static void add(Object object) { threadMap.put(Thread.currentThread(), object); } public static void remove(Object object) { threadMap.remove(Thread.currentThread()); } public static Object get() { return threadMap.get(Thread.currentThread()); } }
public class ThreadContext { private String userId; private Long transactionId; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public Long getTransactionId() { return transactionId; } public void setTransactionId(Long transactionId) { this.transactionId = transactionId; } public String toString() { return 'userId:' + userId + ',transactionId:' + transactionId; } }
public class ThreadLocalMainSampleEx1 { public static void main(String[] args) { new Thread(new Runnable() { public void run() { ThreadContext threadContext = new ThreadContext(); threadContext.setTransactionId(1l); threadContext.setUserId('User 1'); CustomThreadLocal.add(threadContext); //here we call a method where the thread context is not passed as parameter PrintThreadContextValues.printThreadContextValues(); } }).start(); new Thread(new Runnable() { public void run() { ThreadContext threadContext = new ThreadContext(); threadContext.setTransactionId(2l); threadContext.setUserId('User 2'); CustomThreadLocal.add(threadContext); //here we call a method where the thread context is not passed as parameter PrintThreadContextValues.printThreadContextValues(); } }).start(); } }
当我CustomThreadLocal.get()时候,它使用通过内部map去寻找到它自身独有Context上下文信息。
那如果采纳使用ThreadLocal呢?
public class ThreadContext { private String userId; private Long transactionId; private static ThreadLocal threadLocal = new ThreadLocal(){ @Override protected ThreadContext initialValue() { return new ThreadContext(); } }; public static ThreadContext get() { return threadLocal.get(); } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public Long getTransactionId() { return transactionId; } public void setTransactionId(Long transactionId) { this.transactionId = transactionId; } public String toString() { return 'userId:' + userId + ',transactionId:' + transactionId; } }
是不是挺简单的使用的呢?如果配置上Pool,是不是挺完美的,在N多框架中都基本上采用上述方式,ibatis、BoneCP等都是携带
ThreadLocal另外用处是对于非线程安全的实例,通过ThreadLocal的包装同样能够保证并发下的安全。
package ccs.progest.javacodesamples.threadlocal.ex4; import java.text.SimpleDateFormat; import java.util.Date; public class ThreadLocalDateFormat { // SimpleDateFormat is not thread-safe, so each thread will have one private static final ThreadLocal formatter = new ThreadLocal() { @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat('MM/dd/yyyy'); } }; public String formatIt(Date date) { return formatter.get().format(date); } }
ThreadLocal的应用场景
1.类似于userId、tractionId、以及session等
2.为了保证每个线程更好独享自己实例信息
相关推荐
18. this关键字:介绍this的含义和使用场景,如在方法和构造器中的区别。 六、集合框架 19. List接口:学习ArrayList和LinkedList的使用,以及遍历、添加、删除元素的方法。 20. Set接口:理解HashSet和TreeSet的...
4. ThreadLocal:理解ThreadLocal的作用,如何在多线程环境下保持线程局部变量。 5. Volatile关键字:了解其在多线程环境下的内存可见性作用。 六、输入/输出流 1. 流的概念:理解流的流向(输入流和输出流),流的...
3. **多线程**:了解线程的创建、同步与通信,包括synchronized关键字、volatile变量、ThreadLocal、Lock接口等。 4. **IO与NIO**:理解I/O流的分类和使用,了解非阻塞I/O(NIO)的原理和应用场景。 5. **设计模式...
3. 多线程:理解并发编程概念,掌握线程的创建、同步、通信方法,如synchronized、wait/notify、ThreadLocal等。 4. 文件I/O:熟练使用File类,理解流的概念,运用BufferedReader、BufferedWriter等进行文件操作。 5...
- **封装**:理解访问修饰符public、private、protected的含义。 - **异常处理**:掌握try-catch-finally语句块,以及自定义异常。 2. **集合框架** - **ArrayList与LinkedList**:对比两者的性能和应用场景。 ...
1. 线程:掌握线程的创建、同步和协作,包括synchronized、volatile、ThreadLocal关键字的用法。 2. Executor框架:理解ExecutorService、ThreadPoolExecutor和Future接口的应用。 3. Lock接口:了解ReentrantLock、...
理解synchronized、volatile、ThreadLocal等关键字的含义,以及死锁、活锁等问题,是提升程序效率和稳定性的关键。 7. **IO流**:Java的IO流体系庞大,初学者可能只停留在基础的文件读写上,忽视了NIO(非阻塞I/O)...
- 关键字:了解`public`, `private`, `protected`, `static`, `final`, `abstract`, `void`等关键字的含义和用法。 - 类与对象:理解类的定义,对象的创建与初始化,以及构造器的作用。 - 继承与多态:掌握单一...
`FindBugs` 是一款静态代码分析工具,用于检测 Java 代码中的潜在错误和不良实践...通过理解和修复这些问题,可以提高代码质量、性能和安全性。在开发过程中定期运行 `FindBugs` 分析可以帮助及时发现和修复这些问题。
- **多态性**:接口与抽象类的区别,以及重写(override)和重载(overload)的含义。 - **构造器**:了解构造函数的作用,以及this关键字和super关键字在构造器中的应用。 3. **异常处理** - **异常层次结构**...
4. this与super关键字的含义和用法。 5. 类的访问控制修饰符(public, private, protected, default)的理解。 三、集合框架 1. List、Set、Queue、Map四大接口及其实现类的特性。 2. HashMap与Hashtable、...
理解线程和同步机制,如synchronized关键字、 volatile变量、ThreadLocal和并发工具类,将帮助你在多线程环境中编写高效安全的代码。 熟悉Java的IO和NIO(非阻塞I/O)系统。学习如何读写文件,处理流,以及理解缓冲...
6. **并发处理**:Java提供丰富的并发工具类,手册将指导开发者如何安全地使用synchronized、volatile、ThreadLocal等关键字,以及ExecutorService和Future接口,以确保多线程环境下的正确性和性能。 7. **控制语句...
- **ThreadLocal模式**:使用ThreadLocal变量为每个线程保留一个实例,结合了前两者的优势,但在多应用服务器环境下需谨慎使用。 **4. Struts配置** 在Struts的配置文件中,可以通过`<action>`元素来定义Action,...
- 使用ThreadLocal解决线程安全问题的场景。 4. **Java内存模型** - 描述堆内存和栈内存的区别。 - 讲解Java内存区域,包括堆、栈、方法区、程序计数器等。 - 分析JVM内存溢出(OOM)问题的常见原因及解决办法...
包名全部小写,类名首字母大写,常量全大写,变量名尽量表达其含义。 2. 注释规约:注释应简洁明了,对复杂逻辑或难以理解的代码进行解释。避免过度注释,注释应及时更新,与代码保持一致。 3. 代码结构规约:避免...
1. **编程规范**:手册详细规定了Java代码的命名规则、注释规范、代码格式化等,如类名使用驼峰式命名,常量全大写,变量名清晰表达其含义等,确保代码的易读性和一致性。 2. **设计原则**:手册强调面向对象的设计...
这个类的目的是为了方便生成Configuration对象和SessionFactory对象,并且使用ThreadLocal保证每个线程都有一份独立的Session。 掌握Hibernate框架和API的使用,可以有效地解决传统JDBC编程中复杂和繁琐的问题。...
- 在Java中,“线程”有两层含义: - `java.lang.Thread` 类的一个实例。 - 线程的执行过程。 - 使用 `java.lang.Thread` 类或 `java.lang.Runnable` 接口来定义、实例化和启动新线程。 - 每个Java应用从main()...