`

java ThreadLocal本地线程总结

 
阅读更多
首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。

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 是每个线程维护自己专用的变量

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

转自:http://guoba6688-sina-com.iteye.com/blog/721383
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java 中ThreadLocal本地线程和同步机制的比较

    Java中的ThreadLocal是一种特殊的技术,它为每个线程提供了一个独立的变量副本,避免了多线程间的直接共享,从而简化了并发编程的复杂性。ThreadLocal不是一种同步机制,而是设计来解决线程间数据隔离问题的工具。 ...

    java多线程编程总结

    线程本地存储,如 `ThreadLocal` 类,提供了线程安全的数据结构,使得每个线程拥有自己的副本,避免了数据竞争问题。 #### 四、Java线程:线程状态的转换 - **线程的状态** Java线程的状态包括新建 (`NEW`)、...

    java线程本地变量ThreadLocal详解

    Java 线程本地变量 ThreadLocal 详解 ThreadLocal 是 Java 中的一个类,提供了线程安全的对象封装,用于解决多线程访问数据的冲突问题。ThreadLocal 的主要目的是为每个线程提供一个变量副本,从而隔离了多个线程...

    Java多线程编程中ThreadLocal类的用法及深入

    ThreadLocal,直译为“线程本地”或“本地线程”,如果你真的这么认为,那就错了!其实,它就是一个容器,用于存放线程的局部变量,我认为应该叫做 ThreadLocalVariable(线程局部变量)才对,真不理解为什么当初 ...

    ThreadLocal 线程本地变量 及 源码分析.rar_开发_设计

    ThreadLocal是Java编程语言中的一个类,用于在多线程环境下提供线程局部变量。它为每个线程创建了一个独立的变量副本,每个线程只能访问自己的副本,不会影响其他线程。这种机制有助于实现线程安全,尤其在需要线程...

    Java并发编程学习之ThreadLocal源码详析

    ThreadLocal的实现原理可以总结为:每个线程都有一个自己的ThreadLocalMap,用于存放线程的本地变量;ThreadLocal的set、get、remove方法都是基于ThreadLocalMap的操作。 ThreadLocal的优点是可以解决多线程访问...

    java多线程编程实例_Source

    在Java中,线程是程序的执行流,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和一部分堆内存。Java提供了两种创建线程的方式:继承Thread类和实现Runnable接口。实例中可能涵盖了这两种方式的使用,并通过...

    电子书《java线程》

    10. **线程本地存储(ThreadLocal)**:为每个线程提供独立的变量副本,避免了线程间的共享数据冲突。 11. **并发集合**:如ConcurrentHashMap、CopyOnWriteArrayList等,这些集合类在并发环境下提供了高性能的读写...

    Java源码解析ThreadLocal及使用场景

    ThreadLocal是Java中一个非常重要的类,它在多线程环境下经常使用,用于提供线程本地变量。这些变量使每个线程都有自己的一份拷贝,使得多个线程可以独立地使用变量,不会彼此影响。 ThreadLocal的使用场景非常广泛...

    JAVA多线程

    此外,Java提供了线程本地存储(ThreadLocal)机制,允许线程拥有自己的私有数据,这些数据只对线程本身可见,不受其他线程的影响。 #### Java线程:线程状态的转换 线程在其生命周期中会经历多种状态,包括新建(New...

    经典Java多线程与并发库高级应用

    除了上述提到的技术点,本教程还会涉及到ThreadLocal类、线程范围内共享变量、多个线程之间共享数据的方式、java5原子性操作类的应用、Callable与Future的应用、线程锁技术、读写锁技术等内容。这些技术点都旨在帮助...

    正确理解ThreadLocal.pdf

    `ThreadLocal`是Java平台提供的一种线程局部变量的解决方案,它为每一个使用该变量的线程都提供了独立的变量副本,使得每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。这不同于普通的静态...

    java线程学习笔记

    线程本地存储(ThreadLocal)提供了线程内部的局部变量,这些变量对其他线程而言是隔离的。在多线程环境下,ThreadLocal可以用来存储线程特有对象,避免使用全局变量,从而提供线程安全。 线程阻塞是指线程在某些...

    ThreadLocal原理及在多层架构中的应用

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的概念,主要用于在多线程环境中为每个线程提供独立的变量副本。ThreadLocal不是一种数据结构,而是一种解决线程间共享数据的方式,它提供了线程安全的局部...

    深入浅出的学习Java ThreadLocal

    3. **缓存**:在线程内部需要快速访问的数据,可以使用ThreadLocal作为线程内的本地缓存,提高效率。 ### 实现原理 ThreadLocal 的核心在于每个线程内部的 `ThreadLocalMap`,这是一个定制化的哈希表,它存储了...

    国外JAVA面试多线程问题分享.pdf

    Java多线程是Java编程中不可或缺的部分,尤其在面试中,多线程相关的知识点往往成为高级工程师考察的重点。本文将详细解析几个常见的Java多线程面试问题及其答案。 1. **Java中的多线程同步是什么?** 多线程同步...

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

    ThreadLocal是Java中的一个非常重要的线程安全工具类,它在多线程编程中扮演着独特的角色。通过创建ThreadLocal实例,我们可以为每个线程提供一个独立的变量副本,这些副本在各个线程之间互不影响,从而实现线程局部...

    Java面试题线程部分.docx

    线程是程序的执行单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆内存和方法区。线程允许一个应用程序同时执行多个任务,而进程则是资源分配的基本单位,每个进程都有独立的内存空间。 线程...

    ThreadLocal

    ThreadLocal,全称为`java.lang.ThreadLocal`,是Java中用于处理线程局部变量的一个类。它的设计目标是为每个线程提供一个独立的变量副本,使得这些副本只对当前线程可见,从而实现了线程之间的数据隔离。...

    java多线程相关面试题 1

    ThreadLocal 是 Java 中的一种线程本地存储机制,它提供了一种将数据绑定到线程的机制。ThreadLocal 可以用来实现线程安全的数据共享机制。 7. 程序、进程、线程的区别是什么?举个现实的例子说明 程序、进程、...

Global site tag (gtag.js) - Google Analytics