用html做网站步骤安阳网站优化公司推荐
web/
2025/9/26 18:38:05/
文章来源:
用html做网站步骤,安阳网站优化公司推荐,网站制作公司排名前十,网站开发后端怎么开发一、什么是 ThreadLocal ThreadLocal 提供了线程的局部变量#xff0c;每个线程都可以通过 set() 和 get() 来对这个局部变量进行操作#xff0c;但不会和其他线程的局部变量冲突#xff0c;实现了线程间的据隔离。 简单讲#xff1a;一个获取用户的请求线程 A#xff0c;…一、什么是 ThreadLocal ThreadLocal 提供了线程的局部变量每个线程都可以通过 set() 和 get() 来对这个局部变量进行操作但不会和其他线程的局部变量冲突实现了线程间的据隔离。 简单讲一个获取用户的请求线程 A如果向 ThreadLocal 填充变量 AValue只能被线程 A 操作该变量对其他获取用户的请求线程 B、C...是隔离的. 最简单的使用方式 类似一次 HTTP 请求线程中利用 ThreadLocal 存储 Cookie 对象进行状态管理。set Cookie private ThreadLocal httpThreadLocal new ThreadLocal();httpThreadLocal.set(“Cookie: sid13420771402233”)上面存储格式是 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来实现这种隔离 2.2 HTTP Cookie 比如你访问百度、我访问百度会有不同 Cookie 。而且你不能访问我的 Cookie我也不能。顾名思义使用 ThreadLocal 保证每个 HTTP 请求线程的 Cookie 是唯一的。 Cookie 这样才能做 Session 等状态管理。 三、实战场景 总结一下就是ThreadLocal 可以让同一个线程中上下文之间数据共享 在上面章节 二、你熟悉的场景 其实介绍了很多现有场景。那么我这边具体的实战场景是什么 简单的例子 适用满足这两个条件的场景1.每个线程独有的一些信息2.这些信息又会在多个方法或类中用到。 一个请求线程里面有两个异步小线程各有一个方法。分别处理 A 或 B 业务一种方法是传递不可变的入参另一种就是 ThreadLocal放在 ThreadLocal 的入参会被各个方法共享。而且多个请求线程互不影响复杂的例子 一次发货操作会根据入参进行组件化、流程编排话。那么入参会被各个地方用到而且有些流程组件是异步的类似 new thread 操作的。这时候可以定一个 XXContext 上下文 public class XXContext {private static ThreadLocalMapClass?, Object context new InheritableThreadLocal();/*** 把参数设置到上下文的Map中*/public static void put(Object obj) {MapClass?, 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(ClassT c) {MapClass?, Object map context.get();if (map null) {return null;}return (T) map.get(c);}/*** 清空ThreadLocal的数据*/public static void clean() {context.remove();}
} 代码解析 都是 static 操作类似 DateUtil 玩法记得每次请求线程后清理。可以 AOP 去清理加个注解就行。因为同一个请求线程可能被业务方公用。完 转载于:https://www.cnblogs.com/Alandre/p/11145516.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81280.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!