`
cywhoyi
  • 浏览: 421076 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

理解ThreadLocal的涵义

阅读更多

自从碰到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.为了保证每个线程更好独享自己实例信息

分享到:
评论

相关推荐

    java教程(易理解全面)

    18. this关键字:介绍this的含义和使用场景,如在方法和构造器中的区别。 六、集合框架 19. List接口:学习ArrayList和LinkedList的使用,以及遍历、添加、删除元素的方法。 20. Set接口:理解HashSet和TreeSet的...

    java笔试题180道

    4. ThreadLocal:理解ThreadLocal的作用,如何在多线程环境下保持线程局部变量。 5. Volatile关键字:了解其在多线程环境下的内存可见性作用。 六、输入/输出流 1. 流的概念:理解流的流向(输入流和输出流),流的...

    java秋招面试资源

    3. **多线程**:了解线程的创建、同步与通信,包括synchronized关键字、volatile变量、ThreadLocal、Lock接口等。 4. **IO与NIO**:理解I/O流的分类和使用,了解非阻塞I/O(NIO)的原理和应用场景。 5. **设计模式...

    Java面试宝典2018年5月最新版

    3. 多线程:理解并发编程概念,掌握线程的创建、同步、通信方法,如synchronized、wait/notify、ThreadLocal等。 4. 文件I/O:熟练使用File类,理解流的概念,运用BufferedReader、BufferedWriter等进行文件操作。 5...

    Java面试笔试宝典

    - **封装**:理解访问修饰符public、private、protected的含义。 - **异常处理**:掌握try-catch-finally语句块,以及自定义异常。 2. **集合框架** - **ArrayList与LinkedList**:对比两者的性能和应用场景。 ...

    2021年Java大厂面试题整理大全

    1. 线程:掌握线程的创建、同步和协作,包括synchronized、volatile、ThreadLocal关键字的用法。 2. Executor框架:理解ExecutorService、ThreadPoolExecutor和Future接口的应用。 3. Lock接口:了解ReentrantLock、...

    学习java的积点忽略之处

    理解synchronized、volatile、ThreadLocal等关键字的含义,以及死锁、活锁等问题,是提升程序效率和稳定性的关键。 7. **IO流**:Java的IO流体系庞大,初学者可能只停留在基础的文件读写上,忽视了NIO(非阻塞I/O)...

    java各种面试题

    - 关键字:了解`public`, `private`, `protected`, `static`, `final`, `abstract`, `void`等关键字的含义和用法。 - 类与对象:理解类的定义,对象的创建与初始化,以及构造器的作用。 - 继承与多态:掌握单一...

    findbugs报告问题含义

    `FindBugs` 是一款静态代码分析工具,用于检测 Java 代码中的潜在错误和不良实践...通过理解和修复这些问题,可以提高代码质量、性能和安全性。在开发过程中定期运行 `FindBugs` 分析可以帮助及时发现和修复这些问题。

    java面试题集1.zipjava经典面试题集

    - **多态性**:接口与抽象类的区别,以及重写(override)和重载(overload)的含义。 - **构造器**:了解构造函数的作用,以及this关键字和super关键字在构造器中的应用。 3. **异常处理** - **异常层次结构**...

    2019最新一线名企面试题

    4. this与super关键字的含义和用法。 5. 类的访问控制修饰符(public, private, protected, default)的理解。 三、集合框架 1. List、Set、Queue、Map四大接口及其实现类的特性。 2. HashMap与Hashtable、...

    注意:学习过程中的注意事项

    理解线程和同步机制,如synchronized关键字、 volatile变量、ThreadLocal和并发工具类,将帮助你在多线程环境中编写高效安全的代码。 熟悉Java的IO和NIO(非阻塞I/O)系统。学习如何读写文件,处理流,以及理解缓冲...

    java开发手册.pdf

    6. **并发处理**:Java提供丰富的并发工具类,手册将指导开发者如何安全地使用synchronized、volatile、ThreadLocal等关键字,以及ExecutorService和Future接口,以确保多线程环境下的正确性和性能。 7. **控制语句...

    一个Action对应多个类实例。

    - **ThreadLocal模式**:使用ThreadLocal变量为每个线程保留一个实例,结合了前两者的优势,但在多应用服务器环境下需谨慎使用。 **4. Struts配置** 在Struts的配置文件中,可以通过`<action>`元素来定义Action,...

    java后端面试问题整理

    - 使用ThreadLocal解决线程安全问题的场景。 4. **Java内存模型** - 描述堆内存和栈内存的区别。 - 讲解Java内存区域,包括堆、栈、方法区、程序计数器等。 - 分析JVM内存溢出(OOM)问题的常见原因及解决办法...

    阿里巴巴java开发手册.zip

    包名全部小写,类名首字母大写,常量全大写,变量名尽量表达其含义。 2. 注释规约:注释应简洁明了,对复杂逻辑或难以理解的代码进行解释。避免过度注释,注释应及时更新,与代码保持一致。 3. 代码结构规约:避免...

    Java开发手册.zip

    1. **编程规范**:手册详细规定了Java代码的命名规则、注释规范、代码格式化等,如类名使用驼峰式命名,常量全大写,变量名清晰表达其含义等,确保代码的易读性和一致性。 2. **设计原则**:手册强调面向对象的设计...

    javaee课件

    这个类的目的是为了方便生成Configuration对象和SessionFactory对象,并且使用ThreadLocal保证每个线程都有一份独立的Session。 掌握Hibernate框架和API的使用,可以有效地解决传统JDBC编程中复杂和繁琐的问题。...

    Java多线程编程总结

    - 在Java中,“线程”有两层含义: - `java.lang.Thread` 类的一个实例。 - 线程的执行过程。 - 使用 `java.lang.Thread` 类或 `java.lang.Runnable` 接口来定义、实例化和启动新线程。 - 每个Java应用从main()...

Global site tag (gtag.js) - Google Analytics