ThreadLocal
来源:互联网 发布:写c语言用什么软件 编辑:程序博客网 时间:2024/04/24 11:14
1、概念
java.lang.ThreadLocal,提供了线程局部变量,这些变量不同于它们的普通对应物。ThreadLocal实例通常是类中的private static 字段,并且希望将状态与某一个线程(例如事物ID),相关联
它就是一个容器,用于存放线程的局部变量
它产生的原因,是用来解决多线程并发问题而设计的
ThreadLocal在开源框架中都有运用,它有一个内部静态类static class ThreadLocalMap {} ,它的key是当前线程,而value就是我们想保证数据安全一致的某个对象
ThreadLocal就像是超市里的存包的柜子,每个线程只有拿着自己的key,才能得到对应的value
当在一个类中使用了static的成员变量的时候,如果需要它是线程安全的,也就是说多个线程需要独享自己的static的成员变量,那就使用ThreadLocal
一般是通过ThreadLocal来存放java.sql.Connection,来达到事务控制的能力,因为事务控制的关键就是不同的事务,同一个Connection对象
2、常用方法
⑴ public void set(T value) {}
将ThreadLocal的当前线程中的value设置为指定值
⑵ public T get() {}
获取ThreadLocal的当前线程中的value
⑶ public void remove() {}
移除ThreadLocal的当前线程中的value
3、示例【获取和释放Connection对象】
import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class JdbcUtils { private static DataSource dataSource; private static ThreadLocal<Connection> threadLocal; static { // 创建C3P0连接池对象【修改为<named-config name="???">的name属性值】 dataSource = new ComboPooledDataSource("???"); threadLocal = new ThreadLocal<Connection>(); } public static Connection getConnection() { Connection connection = null; // 从ThreadLocal的当前线程中获取Connection对象 connection = threadLocal.get(); // 如果ThreadLocal的当前线程中没有Connection对象 if (null == connection) { try { // 从连接池中获取连接 connection = dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } finally { // 放到ThreadLocal的当前线程中 threadLocal.set(connection); } } return connection; } public static void releaseConnection(Connection connection) { if (null != connection) { try { // 放回到连接池中 connection.close(); } catch (SQLException e) { e.printStackTrace(); } finally { // 将ThreadLocal的当前线程中的Connection移除 threadLocal.remove(); } } }}
阅读全文
0 0
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- threadlocal
- ThreadLocal
- ThreadLocal
- 组件加载
- Spring对bean的装配机制(一)——隐式自动装配
- java实现一个简单的登录界面
- pandas 解析json文件为DataFrame的三种方式以及其灵活度和效率的比较
- ROS之tf空间坐标变换浅析 (二)
- ThreadLocal
- 页面跳转
- Java Web--增删改查之二界面后台java代码
- Stream 中Collectors 的用法
- 动态代理与静态代理
- 版本管理工具学习随笔(一)
- Lucene6.6的介绍和使用
- 21、包含min函数的栈
- Mac通过HEXO搭建博客