美文网首页
浅谈ThreadLocal

浅谈ThreadLocal

作者: 归来依旧少女 | 来源:发表于2019-06-23 23:30 被阅读0次

一、ThreadLocal是什么

ThreadLocal是线程本地存储变量,线程将一些变量存储在ThreadLocal对象中。

二、ThreadLocal的用法

ThreadLocal因为只是放线程自身的需要使用的变量,这些变量只有线程自身能够访问,所以并不能解决多线程并发的问题。那么ThreadLocal在什么场景下使用呢?
先看一个常用的例子:

public class ConnectionManager {
    private static String url ="***";
    private static Connection connect = null;
   
    public static Connection openConnection() throws SQLException {
        if(connect == null){
            connect = DriverManager.getConnection(url);
        }
        return connect;
    }

    public static void closeConnection() throws SQLException {
        if(connect!=null)
            connect.close();
    }
}

获取数据库连接,这是我们刚开始学习jdbc的用法,简单使用是没有问题的。但还是有两个问题无法解决:

  1. 高并发的情况下,可能多个线程同时获取到数据库连接,就会产生并发的问题。我们想到可以使用同步锁来处理,保证只有一个线程获取到数据库连接,但这样毫无疑问效率非常低。
  2. 如果有多条sql需要执行,需要用同一个connection对象。那就需要在多个方法中传递这个connection对象,方法传递会有点麻烦。
    那么有没有更好的方法呢,就是本文讲到的ThreadLocal了。我们稍微修改一下:
public class ConnectionManager {
    private static String url ="***";

    private static final ThreadLocal<Connection> threadLocal = new  ThreadLocal<Connection>();

    public static Connection openConnection() throws SQLException {
        Connection connect = threadLocal.get();
        if(connect == null){
            connect = DriverManager.getConnection(url);
            threadLocal.set(connect);
        }
        return connect;
    }

}

使用了ThreadLocal后,由于线程访问的都是自己的Connection对象,所以就不存在高并发的问题。同时还解决了事务的问题,同一个事务里,Connection对象不需要传来传去,直接用ThreadLocal获取就可以了。
所以我们总结一下ThreadLocal的两点好处:

  1. 每个线程有自己的ThreadLocalMap对象,线程各自访问各自的,提供了保存对象到线程的方法。
  2. 减少了线程间传递参数的麻烦。

基于这样两点好处,我们在获取数据库连接,获取session,获取token信息等场景下使用ThreadLocal会很方便。

相关文章

  • 深入JDK源码一:ThreadLocal

    浅谈ThreadLocal设计 初看ThreadLocal的源码的时候,觉得有几个地方比较晦涩,于是索性按照自己的...

  • ThreadLocal浅谈

    最近在工作中,有用到ThreadLocal类,在我的另外一篇博客中,也提到了一些: 那么,ThreadLocal到...

  • ThreadLocal浅谈

    前言 最近项目中经常用到了ThreadLocal,所以仔细研究一下这个类,以备以后复习。 threadLocals...

  • 浅谈 ThreadLocal

    有时,你希望将每个线程数据(如用户ID)与线程关联起来。尽管可以使用局部变量来完成此任务,但只能在本地变量存在时才...

  • 浅谈ThreadLocal

    在阅读JTA源码的时候,看到事务管理器的是有,遇到这样一段代码。 其中的TheadLocal引起了我的注意。 通过...

  • 浅谈ThreadLocal

    一、ThreadLocal是什么 ThreadLocal是线程本地存储变量,线程将一些变量存储在ThreadLoc...

  • 浅谈synchronized、Lock、ThreadLocal和

    1. 背景 在进行多线程编程时,最让人头痛的无非是线程安全问题,对共享资源的访问控制,如果稍加不注意就可能导致莫名...

  • ThreadLocal

    ThreadLocal 简介ThreadLocal 使用ThreadLocal 原理InheritableThre...

  • ThreadLocal

    ThreadLocal 由于 ThreadLocal 支持范型,如 ThreadLocal< StringBuil...

  • 精通Java并发 - ThreadLocal

    3. ThreadLocal[#3-threadlocal]3.1 ThreadLocal 常用方法[#31-th...

网友评论

      本文标题:浅谈ThreadLocal

      本文链接:https://www.haomeiwen.com/subject/quedqctx.html