Threadlocal使用,原理以及和thread的区别 整理附有代码例子

根据https://www.cnblogs.com/dolphin0520/p/3920407.html整理:

自己整理了下,希望以后查看可以方便点。整理的不是太好,你可以参考上边的网址和他参考的网址多看看线程池的资料也可以把我下边的代码拷到你本地运行下。我的例子中没有用到session所以直接绑定的service如果用session或者你项目请求入口类完全可以绑定当前请求类或者会话,数据库连接通道里边的ThreadLocal<Connection>也可以绑定到数据源上

ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

Thread类中有一个成员变量threadLocals:


这个ThreadLocalMap 是ThreadLocal类中一个静态内部类;


ThreadLocal类中最主要的就是set 方法get方法;

set方法 


这个getMap(t); 传入一个Thread对象返回一个 ThreadLocalMap 内部类

ThreadLocal类中


 在每个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个threadLocals就是用来存储实际的变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。

Thread类中


ThreadLocal类中


如果Thread类中threadLocals为空就是这个map为空的时候:


那么就会把在当前线程的副本中存储要存储的值firstValue和当前ThreadLoal 变量给Thread类中

这样就相当于ThreadLoal 在不同的 Thread 中有不同的副本。

ThreadLocal类中


ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景。后文会通过实例详细阐述该观点。另外,该场景下,并非必须使用 ThreadLocal ,其它方式完全可以实现同样的效果,只是 ThreadLocal 使得实现更简洁。

代码中这个是重点:如果没有清空容器那么ThreadLocal 是不会为空的那么转账就会出现问题,只会一个人转账成功,只有当前线程对应的ThreadLocalMap为空的时候才会为当前线程创建一个ThreadLocalMap的threadlocals,并将第一个值存入到当前map中,hibernate和spring中都有源码可以参考.



这里是把连接通道绑定到当前线程。确保当前线程对应一个连接通道。


码云代码:

https://gitee.com/hexiaoming124/LianShou.git


猜你喜欢

转载自blog.csdn.net/qq_37954693/article/details/80875025