JAVA基础:ThreadLocal

生活

世界上只有两句真理:1、人一定会死。2、程序一定有Bug。

什么是ThreadLocal

昨天学习了java中的线程Thread对象的生命周期,以及中断、线程礼让、线程加入以及三个过期方法的了解。
在Thread中有两个成员,

     ThreadLocal.ThreadLocalMap threadLocals = null;

    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;

可以看到这两个成员都是ThreadLocal.ThreadLocalMap
见名知义:
可以猜到这是本地存储map,并且是与线程绑定的map,并且是线程私有,并不会被多个线程共享,因为每个Thread里都有独立的成员。

ThreadLocal的作用

class ConnectionManager {
     
    private static Connection connect = null;
     
    public static Connection openConnection() {
        if(connect == null){
            connect = DriverManager.getConnection();
        }
        return connect;
    }
     
    public static void closeConnection() {
        if(connect!=null)
            connect.close();
    }
}

如上是一个数据库连接管理类,由于没有加锁,在多线程环境下,可以出现多次初始化connection或者一个在操作,另一个线程却close 连接的情况。
这里需要好好想一想,这里真的需要共享连接吗,其实这里使connection私有就可以了,这里就可以用到ThreadLocal

下面来看下ThreadLocal的使用方法

  static ThreadLocal<Integer> local  = new ThreadLocal<>();

    public static void main(String[] args) {
        local.set(1);
        System.out.println(local.get());
    }

注意main函数本身也是个线程,这个local的使用看起来好像就只是个存储变量的东西,先放置1进去,再取出来,得到1.
可是奇怪了,前面提到Thread中的是ThreadLocalMap,这里写的案例是ThreadLocal,第一次看到ThreadLocal我也挺疑惑的,下面来看看这到底是什么东西?

ThreadLocal图示

在这里插入图片描述
Thread里维护了一个ThreadLocalMap threadLocals,
这是一个线程私有的map,底层是一个Entry数组,Entry的key是ThreadLocal对象,value是对应的值。注意这里的key ThreadLocal是一个弱引用。所以会存在一些问题。下面再说。

ThreadLocal源码解析

先来细看ThreadLocal的set源码:

 public void set(T value) {
 //取到当前线程
        Thread t = Thread.currentThread();
        //取到当前线程的threadLocals对象
        ThreadLocalMap map = getMap(t);
//如果不为空就设置覆盖原值
        if (map != null)
            map.set(this, value);
        else
        //否则创建map
            createMap(t, value);
    }

//createMap调用到ThreadLocalMap的构造器
 ThreadLocalMap(ThreadLocal firstKey, Object firstValue) {
 //创建entry数组,初始化长度16
           
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值