`

ThreadLocal的作用

 
阅读更多

看了N个贴子,ThreadLocal讲得都不是很清楚,纠缠与synchronized的区别。直到看了http://qqdwll.iteye.com/blog/685586 才清晰了ThreadLocal的作用。

 

ThreadLocal可以为每个线程维护自己的变量,对于多线程使用同一对象可以起到管理作用。

 

 

先看个例子:

 

Java代码  收藏代码
  1. package com.koubei.Observable;  
  2.   
  3. import com.sun.org.apache.xalan.internal.xsltc.compiler.sym;  
  4.   
  5. public class UserProcess implements Runnable{  
  6.   
  7.     private UserDAO userDAO;  
  8.       
  9.     public UserProcess(UserDAO userDAO){  
  10.         this.userDAO = userDAO;  
  11.     }  
  12.       
  13.     public  void run() {  
  14.         // TODO Auto-generated method stub  
  15.         for(int i=0; i<1000; i++){  
  16.               
  17.             userDAO.insertUser(getUser());  
  18.         }  
  19.     }  
  20.   
  21.       
  22.       
  23.     public static void main(String[] args) {  
  24.         UserDAO userDAO = new UserDAO();  
  25.           
  26.         new Thread(new UserProcess(userDAO)).start();  
  27.         new Thread(new UserProcess(userDAO)).start();  
  28.         new Thread(new UserProcess(userDAO)).start();  
  29.           
  30.           
  31.     }  
  32. }  

 

Java代码  收藏代码
  1. package com.koubei.Observable;  
  2.   
  3. import java.sql.Connection;  
  4.   
  5. public class UserDAO {  
  6.   
  7.     private Connection conn = null;  
  8.       
  9.     public UserDAO(){  
  10.           
  11.     }  
  12.       
  13.     public void insertUser(User user){  
  14.           
  15.           getConn().prepareStatement(sql);  
  16.           
  17.         //jdbc 操作  
  18.     }  
  19.       
  20.     public synchronized Connection getConn(){  
  21.         if (conn == null) {  
  22.             try {  
  23.                 Class.forName("com.mysql.jdbc.Driver");  
  24.                 CONN = DriverManager.getConnection("jdbc:mysql://"  
  25.                         + DB_IP + ":" + "3306" + "/" + DB_NAME  
  26.                         + "?useUnicode=true&characterEncoding=gbk", DB_USER,  
  27.                         DB_PASSWORD);  
  28.             } catch (Exception ex) {  
  29.                 ex.printStackTrace();  
  30.             }  
  31.         }  
  32.         return conn;  
  33.     }  
  34. }  

 

 

在UserProcess中多个线程引用的同一个UserDAO,在线程运行后所有的语句都是通过一个Connection执行。

 

问题:

1、多个线程使用同一个conn效率比较低,存在数据共享问题。影响效率

 

改进:

1、希望UserDAO中为每个线程开立一个conn,各线程使用自己的连接执行sql

 

改进后的代码

 

Java代码  收藏代码
  1. package com.koubei.Observable;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.SQLException;  
  6.   
  7. public class UserDAO {  
  8.   
  9.     private static ThreadLocal<Connection> connThreadLocal = new ThreadLocal<Connection>();  
  10.       
  11.       
  12.     public UserDAO(){  
  13.           
  14.     }  
  15.       
  16.     public void insertUser(User user){  
  17.           
  18.         getConnection().prepareStatement(sql);  
  19.           
  20.         //jdbc 操作  
  21.     }  
  22.        
  23.     public Connection getConnection(){     
  24.         if (connThreadLocal.get() == null) {  
  25.   
  26.             Connection conn = getConn();  
  27.   
  28.             connThreadLocal.set(conn);  
  29.   
  30.             return conn;  
  31.   
  32.         }   
  33.           
  34.         return connThreadLocal.get();  
  35.   
  36.     }  
  37.   
  38.       
  39.       
  40.     public synchronized  Connection getConn(){  
  41.         try{  
  42.             Class.forName("com.mysql.jdbc.Driver");  
  43.             return DriverManager.getConnection("jdbc:mysql://"  
  44.                     + DB_IP + ":" + "3306" + "/" + DB_NAME  
  45.                     + "?useUnicode=true&characterEncoding=gbk", DB_USER,  
  46.                     DB_PASSWORD);  
  47.         }cache(SQLException e){  
  48.            e.printStackTrace();     
  49.         }  
  50.         return null;  
  51.          
  52.     }  
  53. }  

 改动后每个线程都会维护自己的conn,userDAO变成线程安全的。

 

 synchronized 是解决多个线程访问同一个变量

 ThreadLocal 是每个线程维护自己专用的变量

 两者使用场景不一样,作用也不一样。

分享到:
评论

相关推荐

    ThreadLocal简单Demo

    **线程局部变量(ThreadLocal)** 在Java编程中,`ThreadLocal`是...以上就是关于`ThreadLocal`及其内部类`ThreadLocalMap`的基础知识,它们在多线程编程中起到关键作用,帮助开发者实现高效、安全的线程局部变量管理。

    设计模式及ThreadLocal资料

    理解并熟练应用这些概念和技术,对于提升Java开发者的技能水平,优化代码的可读性和可维护性具有重要作用。在实际开发中,灵活运用设计模式可以提高代码质量,而ThreadLocal则为处理多线程环境下的数据隔离提供了一...

    threadLocal

    3. 内存管理:了解Java的内存模型和垃圾回收机制,才能理解ThreadLocal的内存泄漏风险和弱引用的作用。 4. HTTP相关:虽然题目中没有直接涉及,但HTTPClient是一个常见的网络通信工具,经常和ThreadLocal结合使用,...

    Quartz-ThreadLocal.rar

    ThreadLocal 的作用: 1. **线程隔离**:ThreadLocal 为每个线程提供了一个独立的变量副本,避免了在多线程环境中的共享状态问题,简化了并发编程。 2. **数据存储**:在没有全局状态或者不希望使用同步机制的情况...

    ThreadLocal的用处

    ThreadLocal是Java的`java.lang.ThreadLocal`类,它的主要作用和用法如下: 1. **线程局部变量**: ThreadLocal并不是一个存储数据的容器,而是一个用于创建线程局部变量的模板。当你在ThreadLocal中创建一个实例...

    JDK的ThreadLocal理解(一)使用和测试

    **标题:“JDK的ThreadLocal理解(一)使用...通过以上分析,我们可以看到ThreadLocal在实现线程间数据隔离、简化多线程编程方面的作用。然而,使用时也要注意避免内存泄漏和过度依赖,合理规划其在系统架构中的位置。

    Spring事务处理-ThreadLocal的使用

    在实际应用中,理解ThreadLocal在Spring事务处理中的作用有助于优化并发性能和解决多线程环境下的事务问题。例如,如果线程之间需要共享数据,但又不想影响其他线程,ThreadLocal就是一个理想的选择。同时,也要注意...

    ThreadLocal相关

    ThreadLocal 的主要作用是提供线程内的局部变量。这种变量在线程的生命周期内起作用,减少同一个线程中的变量之间的相互干扰。当多个线程访问同一个 ThreadLocal 变量时,每个线程将拥有其自己的变量副本,而不是...

    Synchronized与ThreadLocal

    ### Synchronized与ThreadLocal #### 一、Synchronized机制详解 **Synchronized** 是 Java 中一个非常重要的关键字,主要用于实现线程同步。它通过在对象上加锁来确保多个线程能够安全地访问共享资源。 - **作用...

    JAVA ThreadLocal类深入

    ThreadLocal并不是一个线程对象,而是线程局部变量,即threadlocalvariable,它的主要作用是确保每个线程都有自己的变量实例,互不干扰。 ### 一、ThreadLocal工作原理 ThreadLocal通过内部的Map存储每个线程的...

    18 线程作用域内共享变量—深入解析ThreadLocal.pdf

    **ThreadLocal** 是Java提供的一个工具类,用于在**线程作用域内**创建和管理独立的变量副本。这意味着每个线程都有自己的变量副本,不会互相影响,从而实现了线程安全。 **ThreadLocal的使用场景** 1. **存储线程...

    理解ThreadLocal

    ThreadLocal 在 Spring 中发挥着重要的作用,在管理 request 作用域的 Bean、事务管理、任务调度、AOP 等模块都出现了它们的身影,起着举足轻重的作用。要想了解 Spring 事务管理的底层技术,ThreadLocal 是必须...

    通向架构师的道路(第七天)之漫谈使用ThreadLocal改进你的层次的划分

    在通向架构师的道路中,ThreadLocal是一个重要的工具,它在Java多线程编程中起到关键作用,尤其是在优化层次划分时。ThreadLocal自JDK 1.2起就存在,它不是一个线程,而是一种管理线程局部变量的机制。每个线程都有...

    ThreadLocal详解

    在Spring框架中,ThreadLocal的应用非常广泛,尤其是在请求作用域的Bean管理、事务管理、任务调度和AOP等方面。例如,在Spring的DAO模板类中,尽管底层的数据连接或会话资源是非线程安全的,但是通过使用ThreadLocal...

    ThreadLocal的原理,源码深度分析及使用.docx

    ThreadLocal 翻译过来就是本地线程,但是直接这么翻译很难理解 ThreadLocal 的作用。如果换一种说法,可以称为线程本地存储。简单来说,就是 ThreadLocal 为共享变量在每个线程中都创建一个副本,每个线程可以访问...

    Java ThreadLocal的设计理念与作用

    主要介绍了Java ThreadLocal的设计理念与作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    javaweb 通过threadlocal 手动提交事务

    3. **ThreadLocal的原理与作用** ThreadLocal为每个线程提供了一个独立的变量副本,各个线程可以独立地改变自己的副本,而不会影响其他线程中的副本。在多线程环境下,它可以用来实现线程间的数据隔离,避免了共享...

    简单分析Java线程编程中ThreadLocal类的使用共

    首先,ThreadLocal类的主要作用是为每个线程创建一个单独的变量副本。这意味着在同一个ThreadLocal变量中,不同的线程可以存储各自独立的值,互不干扰。这在需要线程间隔离数据的场景下非常有用,例如数据库连接、...

    正确理解ThreadLocal

    2. **作用**:ThreadLocal主要用在多线程环境下,为每个线程提供独立的、线程私有的变量副本,避免了线程间的数据共享带来的同步问题,提高了并发性能。 **二、ThreadLocal的工作原理** 1. **内存模型**:每个...

    Android 中 ThreadLocal使用示例

    在Android开发中,ThreadLocal是一个非常重要的工具类,它提供了线程局部变量的存储机制。ThreadLocal类允许我们在多线程环境下为每...在实际开发中,我们可以结合线程池、Handler等机制,充分发挥ThreadLocal的作用。

Global site tag (gtag.js) - Google Analytics