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();            }        }    }}