线程局部变量ThreadLocal的原理及使用范围_1

时间:2022-12-22 19:10:44

线程局部变量ThreadLocal的原理及使用范围

使用原理

每个Thread中都有一个ThreadLocalMap成员, 该成员是ThreadLocal的内部类ThreadLocalMap类型。每使用ThreadLocal时,具体的流程如下

  • 1 新建一个ThreadLocal对象

    ThreadLocal<String> stringLocal = new ThreadLocal<String>();

  • 2 将需要全线程使用的成员set进threadLocalMap

    stringLocal.set("string test1.");

  • 3 获取strTest成员


String strTest = stringLocal.get();
if (null == strTest){
stringLocal.set("string test1.");
}

第2点在set成员时,会先获取 当前Thread的ThreadLocalMap成员,如果为空,会重新new 一个 ThreadLocalMap 对象赋给该成员,然后 以ThreadLocal对象引用为key,set值为 value,存入ThreadLocalMap.

第3点会以ThreadLocal对象引用为key, 在当前线程的ThreadLocalMap中获取之前set的对象

优点

线程局部变量会随线程的结束而销毁,能对合理运用内存

能在整个线程内任意取用资源,不受参数传递的限制

使用场景

  • 多线程对象独享 单个线程的数据库连接的获取和关闭,游戏中每个房间应该就可以做为一个线程,一些公共数据可以存在线程局部变量中,用户登录购物网站时一些公共数据也可以放在线程局部变量中。