java ThreadLocal本地线程总结
来源:互联网 发布:淘宝的书是正版吗 编辑:程序博客网 时间:2024/05/20 16:00
首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。
ThreadLocal可以为每个线程维护自己的变量,对于多线程使用同一对象可以起到管理作用。
在UserProcess中多个线程引用的同一个UserDAO,在线程运行后所有的语句都是通过一个Connection执行。
问题:
1、多个线程使用同一个conn效率比较低,存在数据共享问题。影响效率。
改进:
1、希望UserDAO中为每个线程开立一个conn,各线程使用自己的连接执行sql
改进后的代码
改动后每个线程都会维护自己的conn,userDAO变成线程安全的。
synchronized 是解决多个线程访问同一个变量
ThreadLocal 是每个线程维护自己专用的变量
两者使用场景不一样,作用也不一样。
转自:http://guoba6688-sina-com.iteye.com/blog/721383
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
0 0
- java ThreadLocal本地线程总结
- Java线程(篇外篇):线程本地变量ThreadLocal
- Java线程(篇外篇):线程本地变量ThreadLocal
- Java线程(篇外篇):线程本地变量ThreadLocal
- Java线程(篇外篇):线程本地变量ThreadLocal
- Java线程(篇外篇):线程本地变量ThreadLocal
- Java线程(篇外篇):线程本地变量ThreadLocal
- Java线程(篇外篇):线程本地变量ThreadLocal
- Java线程(篇外篇):线程本地变量ThreadLocal
- Java线程(篇外篇):线程本地变量ThreadLocal
- Java线程(篇外篇):线程本地变量ThreadLocal
- Java线程(篇外篇):线程本地变量ThreadLocal
- Java线程(篇外篇):线程本地变量ThreadLocal
- 14.Java本地线程(ThreadLocal)
- ThreadLocal---线程本地变量
- ThreadLocal本地线程
- ThreadLocal---线程本地变量
- 本地线程ThreadLocal
- Linux命令杂记
- Activiti获取待办任务信息
- java Split用法
- 程序员面试金典——原串翻转
- C++继承之多重继承与虚基类
- java ThreadLocal本地线程总结
- Spring单例模式(singleton)和多例模式(prototype)
- 20个必会的JavaScript面试题
- Android工程方法数超过65535
- Activiti小知识总结
- css 水平和垂直居中 js 引用外部css
- Activiti根据Flowname进行转向
- java map转javaBean 反射参数异常处理
- redigo代码分析-pool