真实项目中 ThreadLocal 的妙用

  • 时间:
  • 浏览:1
  • 来源:大发时时彩官网_大发时时彩邀请码_大发时时彩娱乐平台

一、哪此是 ThreadLocal

ThreadLocal 提供了应用应用程序的局部变量,每个应用应用程序都还还后能 通过 set() 和 get() 来对你你是什么局部变量进行操作,但不让和或者 应用应用程序的局部变量冲突,实现了应用应用程序间的据隔离。

简单讲:那我获取用户的请求应用应用程序 A,可能向 ThreadLocal 填充变量 AValue(不还还后能 被应用应用程序 A 操作),该变量对或者 获取用户的请求应用应用程序 B、C...是隔离的.

最简单的使用最好的办法:

这类一次 HTTP 请求应用应用程序中,利用 ThreadLocal 存储 Cookie 对象,进行清况 管理。set Cookie:

private ThreadLocal httpThreadLocal = new ThreadLocal();

httpThreadLocal.set(“Cookie: sid=13420771402233”)

后边存储格式是 String ,实际场景存储的是具体的对象。在这次 HTTP 请求过程中,任何以后 都还还后能 获取 Cookie 。获取最好的办法很简单 get Cookie:

String cookieValue = (String) httpThreadLocal.get();

Thread 与 ThreadLocal 对象引用关系图

二、你熟悉的场景

2.1 数据库连接池

比如一次请求应用应用程序进来,业务 Dao 还要更新 user 表和 user-detail 表。可能是 new 出那我数据库 Connection ,分别不同的 Connection 操作 user 表和 user-detail 表,就无法保证事务。这么 数据库连接池是要怎样保证的?

答案是:利用 ThreadLocal 存储唯一 Connection 对象。每次请求应用应用程序,pool.getConnection 获取连接的以后 都是那我操作:

  • 会从 ThreadLocal 获取 Connection 对象。可能有,则保证了后边多个数据库操作共用同那我 Connection ,从而保证了事务。
  • 可能这么 ,往 ThreadLocal 新增Connection 对象,并返回到应用应用程序
错误的做法
public class XXXService {

    private Connection conn;
}

可能 conn 是应用应用程序不安全的。那我会因为多个请求公用那我连接。请求量很大的清况 下,延迟各种。你懂。

而是我 ,使用 ThreadLocal 保证每个请求应用应用程序的 Connection 是唯一的。即每个应用应用程序有被委托人的连接。

继续讲到 Spring 框架,在事务开使英语 时,会给当前应用应用程序那我Jdbc Connection,在整个事务过程,都是使用该应用应用程序绑定的connection来执行数据库操作,实现了事务的隔离性。Spring框架后边而是我用的ThreadLocal来实现你你是什么隔离

比如你访问百度、我访问百度,会有不同 Cookie 。而是我 你不还还后能 访问我的 Cookie,我而是我还还后能 。顾名思义,使用 ThreadLocal 保证每个 HTTP 请求应用应用程序的 Cookie 是唯一的。

Cookie 那我不能做 Session 等清况 管理。

三、实战场景

总结一下而是我:ThreadLocal 还还后能 让同那我应用应用程序中上下文之间数据共享

在后边章节 二、你熟悉的场景 真是介绍了而是我现有场景。这么 我这边具体的实战场景是哪此?

简单的例子:

适用满足这那我条件的场景:1.每个应用应用程序独有的或者 信息,2.哪此信息又会在多个最好的办法或类中用到。

  1. 那我请求应用应用程序,后边有那我异步小应用应用程序,各有那我最好的办法。分别处理 A 或 B 业务
  2. 五种 最好的办法是传递不可变的入参
  3. 另五种 而是我 ThreadLocal,倒进 ThreadLocal 的入参,会被各个最好的办法共享。而是我 多个请求应用应用程序互不影响
比较复杂的例子:

一次发货操作:会根据入参,进行组件化、流程编排话。这么 入参会被各个地方用到,而是我 或者 流程组件是异步的(这类 new thread 操作的)。这以后 还还后能 定那我 XXContext 上下文:

public class XXContext {
    
    private static ThreadLocal<Map<Class<?>, Object>> context = new InheritableThreadLocal<>();
    
    /**
     * 把参数设置到上下文的Map中
     */
    public static void put(Object obj) {
        Map<Class<?>, Object> map = context.get();
        if (map == null) {
            map = new HashMap<>();
            context.set(map);
        }
        if (obj instanceof Enum) {
            map.put(obj.getClass().getSuperclass(), obj);
        } else {
            map.put(obj.getClass(), obj);
        }
    }
    
    /**
     * 从上下文中,根据类名取出参数
     */
    @SuppressWarnings("unchecked")
    public static <T> T get(Class<T> c) {
        Map<Class<?>, Object> map = context.get();
        if (map == null) {
            return null;
        }
        return (T) map.get(c);
    }
    
    /**
     * 清空ThreadLocal的数据
     */
    public static void clean() {
        context.remove();
    }
}

代码解析:

  • 都是 static 操作,这类 DateUtil 玩法
  • 记得每次请求应用应用程序后清理。还还后能 AOP 去清理,加个注解就行。可能同那我请求应用应用程序可能被业务方公用。

(完)

猜你喜欢

萨格勒布迪纳摩U19VS萨格勒布火车头U19免费视频直播,萨格勒布迪纳摩U19VS萨格勒布火车头U19比赛集锦,萨格勒布迪纳摩U19VS萨格勒布火车头U19录像,萨格勒布迪纳摩U19VS萨格勒布火车头U19首发阵容

首页新闻视频直播数据APP懂球号直播君广告企业企业合作萨格勒布迪纳摩U1911-1020:00克亚U191-0已现在开使萨格勒布火车头U19直播君|分析|集锦暂无数据近期比赛佛

2020-01-27

真·自动驾驶:开启Autopilot的特斯拉车主在高速公路上打盹

IT之家1月31日消息 据外媒的新闻,一位特斯拉ModelX的车主在汽车沿着高速公路行驶时打盹。视频中的特斯拉司机是没人放松,以至于他甚至都没人开车。Autopilot功能在这

2020-01-27

N. Glushkov数据,N. Glushkov新闻,N. Glushkov视频,N. Glushkov身价

N.GlushkovN.Glushkov俱乐部:恰卡国籍:俄罗斯身高:175CM位置:中场年龄:20岁体重:57KG号码:23号生日:1999-03-19惯用脚:赛季俱乐部上场

2020-01-27

Z. Agalarov数据,Z. Agalarov新闻,Z. Agalarov视频,Z. Agalarov身价

Z.AgalarovZ.Agalarov俱乐部:马哈奇卡拉国籍:俄罗斯身高:CM位置:后卫年龄:体重:KG号码:号生日:惯用脚:赛季俱乐部上场首发进球助攻黄牌红牌替补2019/

2020-01-27

中国古典园林文化——精华萃于江南

中国现存的著名古典园林数量不少,多数是明、清两代的遗物。而中国古典园林的精华则集中在江南。前人有所谓“江南园林甲天下,苏州园林甲江南”的评语。我国建筑界也认为“中国古典园林精华

2020-01-27