加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

陈硕主讲最新C++网络编程实践视频教程 全套84课

发布时间:2020-12-15 04:47:29 所属栏目:百科 来源:网络整理
导读:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 从上面的示例可以看出,在不同的线程中对ThreadLocal变量进行set和get操作时,它们的变量是相互独立的. 为什么ThreadLocal能实现线程变量隔离 从源码中可知,每一个Thread内部都有一个ThreadLocalMap,ThreadLocal

1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


从上面的示例可以看出,在不同的线程中对ThreadLocal变量进行set和get操作时,它们的变量是相互独立的.

为什么ThreadLocal能实现线程变量隔离


从源码中可知,每一个Thread内部都有一个ThreadLocalMap,ThreadLocalMap里面 Key是当前ThreadLocal对象,Value是线程对应的变量副本,ThreadLocal所做的事情就是 负责维护每个Thread内部的ThreadLocalMap.


ThreadLocal的核心方法

T get(); ? // 获取本地线程变量


void set(T value) // 设置本地线程变量


void remove(); // 移除本地线程变量


1


2


3


get()的执行内容:


1. 根据Thread.currentThread() 获取当前执行线程信息,并根据当前线程对象获取该线程的ThreadLocalMap对象


2. 若map不为空,直接根据当前ThreadLocal对象获取entry,进入过去value副本并返回


3. 若map为空,将线程变量副本写入null,并返回null.

set()的执行内容:


1. 根据Thread.currentThread() 获取当前执行线程信息,将ThreadLocal对象和值写入到当前线程对应的map中.


3. 若map为空,则需要初始化当前线程的ThreadLocalMap对象,再写入ThreadLocal和value的副本.

remove()的执行内容:


1. 获取当前线程的ThreadLocalMap并移除Key为当前ThreadLocal对象的键值对.

ThreadLocal的问题(可能内存泄漏)


当ThreadLocal存储了很多 Key = null 的Entry时,但长时间不结束当前thread 且不再调用get(),set(),remove() 方法,那么当ThreadLocal对象被回收后,Key是弱引用也被回收,但是Value是强引用,一直不回收,就容易导致内存泄漏.


如何解决该问题: 每次调用完ThreadLocal之后,都调用remove()方法,手动销毁数据.

ThreadLocal带来的好处


ThreadLocal把操作的数据存储在了线程本地,直接本地内存读取,不再需要synchronized等同步的方式修改主内存的数据,然后再复制到本地内存,提高了访问效率. 这也是为什么ThreadLocal能解决线程安全的问题.


ThreadLocal和线程同步的一些异同: 同步机制采用了“以时间换空间”的方式: 串行访问数据,并共享对象. 而ThreadLocal采用了“以空间换时间”的方式: 并行访问,独享对象.


主要应用场景


在维护每个线程的Session的时候,ThreadLocal能帮助我们在每个线程中独享资源.


数据库连接在多线程读取的时候,使用ThreadLocal包装,能将线程和数据库连接绑定,方便事务操作.


---------------------?


作者:朝夕夕夕夕?


来源:CSDN?


原文:https://blog.csdn.net/wau_hua/article/details/85067292?


版权声明:本文为博主原创文章,转载请附上博文链接!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读