看了N个贴子,ThreadLocal讲得都不是很清楚,纠缠与synchronized的区别。直到看了http://qqdwll.iteye.com/blog/685586 才清晰了ThreadLocal的作用。
ThreadLocal可以为每个线程维护自己的变量,对于多线程使用同一对象可以起到管理作用。
先看个例子:
package com.koubei.Observable;
import com.sun.org.apache.xalan.internal.xsltc.compiler.sym;
public class UserProcess implements Runnable{
private UserDAO userDAO;
public UserProcess(UserDAO userDAO){
this.userDAO = userDAO;
}
public void run() {
// TODO Auto-generated method stub
for(int i=0; i<1000; i++){
userDAO.insertUser(getUser());
}
}
public static void main(String[] args) {
UserDAO userDAO = new UserDAO();
new Thread(new UserProcess(userDAO)).start();
new Thread(new UserProcess(userDAO)).start();
new Thread(new UserProcess(userDAO)).start();
}
}
package com.koubei.Observable;
import java.sql.Connection;
public class UserDAO {
private Connection conn = null;
public UserDAO(){
}
public void insertUser(User user){
getConn().prepareStatement(sql);
//jdbc 操作
}
public synchronized Connection getConn(){
if (conn == null) {
try {
Class.forName("com.mysql.jdbc.Driver");
CONN = DriverManager.getConnection("jdbc:mysql://"
+ DB_IP + ":" + "3306" + "/" + DB_NAME
+ "?useUnicode=true&characterEncoding=gbk", DB_USER,
DB_PASSWORD);
} catch (Exception ex) {
ex.printStackTrace();
}
}
return conn;
}
}
在UserProcess中多个线程引用的同一个UserDAO,在线程运行后所有的语句都是通过一个Connection执行。
问题:
1、多个线程使用同一个conn效率比较低,存在数据共享问题。影响效率
改进:
1、希望UserDAO中为每个线程开立一个conn,各线程使用自己的连接执行sql
改进后的代码
package com.koubei.Observable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class UserDAO {
private static ThreadLocal<Connection> connThreadLocal = new ThreadLocal<Connection>();
public UserDAO(){
}
public void insertUser(User user){
getConnection().prepareStatement(sql);
//jdbc 操作
}
public Connection getConnection(){
if (connThreadLocal.get() == null) {
Connection conn = getConn();
connThreadLocal.set(conn);
return conn;
}
return connThreadLocal.get();
}
public synchronized Connection getConn(){
try{
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://"
+ DB_IP + ":" + "3306" + "/" + DB_NAME
+ "?useUnicode=true&characterEncoding=gbk", DB_USER,
DB_PASSWORD);
}cache(SQLException e){
e.printStackTrace();
}
return null;
}
}
改动后每个线程都会维护自己的conn,userDAO变成线程安全的。
synchronized 是解决多个线程访问同一个变量
ThreadLocal 是每个线程维护自己专用的变量
两者使用场景不一样,作用也不一样。
分享到:
相关推荐
**线程局部变量(ThreadLocal)** 在Java编程中,`ThreadLocal`是...以上就是关于`ThreadLocal`及其内部类`ThreadLocalMap`的基础知识,它们在多线程编程中起到关键作用,帮助开发者实现高效、安全的线程局部变量管理。
理解并熟练应用这些概念和技术,对于提升Java开发者的技能水平,优化代码的可读性和可维护性具有重要作用。在实际开发中,灵活运用设计模式可以提高代码质量,而ThreadLocal则为处理多线程环境下的数据隔离提供了一...
3. 内存管理:了解Java的内存模型和垃圾回收机制,才能理解ThreadLocal的内存泄漏风险和弱引用的作用。 4. HTTP相关:虽然题目中没有直接涉及,但HTTPClient是一个常见的网络通信工具,经常和ThreadLocal结合使用,...
ThreadLocal 的作用: 1. **线程隔离**:ThreadLocal 为每个线程提供了一个独立的变量副本,避免了在多线程环境中的共享状态问题,简化了并发编程。 2. **数据存储**:在没有全局状态或者不希望使用同步机制的情况...
ThreadLocal是Java的`java.lang.ThreadLocal`类,它的主要作用和用法如下: 1. **线程局部变量**: ThreadLocal并不是一个存储数据的容器,而是一个用于创建线程局部变量的模板。当你在ThreadLocal中创建一个实例...
**标题:“JDK的ThreadLocal理解(一)使用...通过以上分析,我们可以看到ThreadLocal在实现线程间数据隔离、简化多线程编程方面的作用。然而,使用时也要注意避免内存泄漏和过度依赖,合理规划其在系统架构中的位置。
在实际应用中,理解ThreadLocal在Spring事务处理中的作用有助于优化并发性能和解决多线程环境下的事务问题。例如,如果线程之间需要共享数据,但又不想影响其他线程,ThreadLocal就是一个理想的选择。同时,也要注意...
ThreadLocal 的主要作用是提供线程内的局部变量。这种变量在线程的生命周期内起作用,减少同一个线程中的变量之间的相互干扰。当多个线程访问同一个 ThreadLocal 变量时,每个线程将拥有其自己的变量副本,而不是...
### Synchronized与ThreadLocal #### 一、Synchronized机制详解 **Synchronized** 是 Java 中一个非常重要的关键字,主要用于实现线程同步。它通过在对象上加锁来确保多个线程能够安全地访问共享资源。 - **作用...
ThreadLocal并不是一个线程对象,而是线程局部变量,即threadlocalvariable,它的主要作用是确保每个线程都有自己的变量实例,互不干扰。 ### 一、ThreadLocal工作原理 ThreadLocal通过内部的Map存储每个线程的...
**ThreadLocal** 是Java提供的一个工具类,用于在**线程作用域内**创建和管理独立的变量副本。这意味着每个线程都有自己的变量副本,不会互相影响,从而实现了线程安全。 **ThreadLocal的使用场景** 1. **存储线程...
ThreadLocal 在 Spring 中发挥着重要的作用,在管理 request 作用域的 Bean、事务管理、任务调度、AOP 等模块都出现了它们的身影,起着举足轻重的作用。要想了解 Spring 事务管理的底层技术,ThreadLocal 是必须...
在通向架构师的道路中,ThreadLocal是一个重要的工具,它在Java多线程编程中起到关键作用,尤其是在优化层次划分时。ThreadLocal自JDK 1.2起就存在,它不是一个线程,而是一种管理线程局部变量的机制。每个线程都有...
在Spring框架中,ThreadLocal的应用非常广泛,尤其是在请求作用域的Bean管理、事务管理、任务调度和AOP等方面。例如,在Spring的DAO模板类中,尽管底层的数据连接或会话资源是非线程安全的,但是通过使用ThreadLocal...
ThreadLocal 翻译过来就是本地线程,但是直接这么翻译很难理解 ThreadLocal 的作用。如果换一种说法,可以称为线程本地存储。简单来说,就是 ThreadLocal 为共享变量在每个线程中都创建一个副本,每个线程可以访问...
主要介绍了Java ThreadLocal的设计理念与作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
3. **ThreadLocal的原理与作用** ThreadLocal为每个线程提供了一个独立的变量副本,各个线程可以独立地改变自己的副本,而不会影响其他线程中的副本。在多线程环境下,它可以用来实现线程间的数据隔离,避免了共享...
首先,ThreadLocal类的主要作用是为每个线程创建一个单独的变量副本。这意味着在同一个ThreadLocal变量中,不同的线程可以存储各自独立的值,互不干扰。这在需要线程间隔离数据的场景下非常有用,例如数据库连接、...
2. **作用**:ThreadLocal主要用在多线程环境下,为每个线程提供独立的、线程私有的变量副本,避免了线程间的数据共享带来的同步问题,提高了并发性能。 **二、ThreadLocal的工作原理** 1. **内存模型**:每个...
在Android开发中,ThreadLocal是一个非常重要的工具类,它提供了线程局部变量的存储机制。ThreadLocal类允许我们在多线程环境下为每...在实际开发中,我们可以结合线程池、Handler等机制,充分发挥ThreadLocal的作用。