良许Linux教程网 干货合集 讲解一下Java中的ThreadLocal

讲解一下Java中的ThreadLocal

多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。

ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一乐ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题。

讲解一下Java中的ThreadLocal

用法

多个线程在调用同一个方法的时候,会有并发问题,解决这种问题最简单的办法就是将数据保存在Thread的自己的结构中,也就是ThreadLocal的作用了。用法如下:

classJavaBean{staticThreadLocal threadLocal =newThreadLocal();publicvoid prepare(){
       threadLocal.set(0);}publicvoid work(){for(int i =0; i run(){
       bean.prepare();
       bean.work();}}publicclassThreadLocalDemo{publicstaticvoid main(String[] args){JavaBean bean =newJavaBean();for(int i =0; i 

从输出中可以看到,多个线程操作同一个threadLocal时,结果并不会出错。

可以将ThreadLocal看做是对Thread.threadLocals的封装,况且在程序中也是不能直接访问到Thread.threadLocals。

原理

下面简单看ThreadLocal的原理,在Thread中保存了一个Map,类型可以认为是Map,其中T是要保存数据的类型。当要从中取出数据时,调用的流程如下:

Thread.currentThread().threadLocals.getEntry(threadLocal).value

这样,不同的线程在执行的时候在同一个threadLocal上获取到的是不同的数据,线程之间的隔离性是通过”各自保存不同的Map”来实现的,而看到的threadLocal对象其实是KEY,在操作前get到的是VALUE。其实自己动手做一个线程安全的数据保存的解决方法也是这个思路。

在ThreadLocalMap中使用的并不是普通的引用保存数据,而是使用WeakReference来做:

staticclassEntryextendsWeakReference{Object value;Entry(ThreadLocal k,Object v){super(k);
       value = v;}}

这样如果ThreadLocal被释放了,那么ThreadLocalMap中的Entry也会被释放,不至于造成内存泄露。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

img
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部