• 技术文章 >java >java基础

    java中ThreadLocal的应用场景分析

    小妮浅浅小妮浅浅2021-03-22 10:20:12原创3973

    本教程操作环境:windows7系统、java10版,DELL G3电脑。

    1、各种框架中的应用

    Spring框架的事务管理中使用ThreadLocal来管理连接,每个线程是单独的连接,当事务失败时不能影响到其他线程的事务过程或结果,还有大家耳闻目睹的ORM框架、Mybatis也是用ThreadLocal管理,SqlSession也是如此。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    //Spring TransactionSynchronizationManager类

    @Override

    protected void doBegin(Object transaction, TransactionDefinition definition) {

        DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;

        Connection con = null;

        try {

            //此处省略N行代码

            if (txObject.isNewConnectionHolder()) {

                //绑定数据库连接到线程中

                TransactionSynchronizationManager.bindResource(obtainDataSource(), txObject.getConnectionHolder());

            }

        }

        catch (Throwable ex) {

            if (txObject.isNewConnectionHolder()) {

                //当发生异常时,移除线程中的连接

                DataSourceUtils.releaseConnection(con, obtainDataSource());

                txObject.setConnectionHolder(null, false);

            }

            throw new CannotCreateTransactionException("Could not open JDBC Connection for transaction", ex);

        }

    }

    2、防止内存泄漏

    通常我们是使用如下的方式操作ThreadLocal,在使用完threadlocal后一定要remove掉,防止内存泄露。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    private static final ThreadLocal<LoginUser> loginUserLocal = new ThreadLocal<LoginUser>();

      

    public static LoginUser getLoginUser() {

        return loginUserLocal.get();

    }

      

    public static void setLoginUser(LoginUser loginUser) {

        loginUserLocal.set(loginUser);

    }

      

    public static void clear() {

        loginUserLocal.remove();

    }

      

    //在使用完后一定要清理防止内存泄露

    try{

        loginUserLocal.set(loginUser);

        //执行其他业务逻辑

    }finally{

        loginUserLocal.remove();

    }

    以上就是java中ThreadLocal的应用场景分析,大家在了解了这种变量的作用后,可以就这些使用场景,逐个进行尝试。

    专题推荐:java threadlocal
    上一篇:java中ThreadLocal核心方法有哪些? 下一篇:java中创建对象的步骤有哪些?

    相关文章推荐

    • java threadLocal源码探究• java中ThreadLocal核心方法有哪些?

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网