• 技术文章 >java >java基础

    java中ThreadLocal的应用场景分析

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

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

    1、各种框架中的应用

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

    //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掉,防止内存泄露。

    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学习网