多线程之ThreadLocal

ThreadLocal

threadLocal是用来解决多线程并发访问的线程安全问题,其实就是把变量隔离在线程内部处理,从而实现多线程访问变量不受外部线程影响。

ThreadLocal与Synchronzied

说到多线程并发问题Synchronzied肯定是绕不开,Synchronzied是系统提供解决并发问题的且使用场景最多的关键字,可ThreadLocal与synchronized有本质的差别,synchronized是利用锁的机制,使变量或代码块在某一时该仅仅能被一个线程访问。而ThreadLocal为每个线程都提供了变量的副本,使得每个线程在某一时间访问到的并非同一个对象,这样就隔离了多个线程对数据的数据共享。


ThreadLocal的使用

最重要的4个方法:

protected Object initialValue() 

这个方法是ThreadLocal是初始化方法  第一次调用get的时候会调用这个方法,且只会调用一次,看源码~

当我们调用get方法时候getMap(t)回去当前threadLocals如果为空,那么就setInitialValue(),再次判断当前getMap(t) 为空后createMap,这时候new ThreadLocalMap(this, firstValue);


createMap


get  setInitialValue

public void set(T value) 

设置当前线程的线程局部变量的值。

public T get()

获取当前线程的线程局部变量的值。

public void remove() 

将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。

ThreadLocal解析

先上图


threadLocal

ThreadLocal其实内部依赖ThreadLocalMap,ThreadLocalMap是ThreadLocal的静态内部类 ,ThreadLocalMap内部存放这Entry数组 key是当前线程,value就是需要隔离访问当变量


可以看到有个Entry内部静态类,它继承了WeakReference,总之它记录了两个信息,一个是ThreadLocal<?>类型,一个是Object类型的值。getEntry方法则是获取某个ThreadLocal对应的值,set方法就是更新或赋值相应的ThreadLocal对应的值。再来看下getEntry


getEntry时从ThreadLocalMap的Entry[]里面获取键值为传入key对应的value 

ThreadLocal的内存泄漏

threadlocal内存泄漏

解决方案:使用完后调用threadLocal.remove()

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 ThreadLocal是什么?有什么作用?我们直接说结论。 ThreadLocal跟线程同步机制没有半毛钱关...
    懒癌患者2018阅读 383评论 0 1
  • ThreadLocal提供了线程的局部变量,每个线程都可以通过set()和get()来对这个局部变量进行操作,但不...
    cpyl阅读 369评论 0 1
  • 作为从JDK1.2就引入的特性,ThreadLocal这个名字大家可能见得比较少,从字面看,直译为“线程本地”,一...
    两句挽联阅读 782评论 0 51
  • 对于ThreadLocal这个类我相信多数java攻城狮都不陌生,它是java多线程中的一个重要的类,在面试时经常...
    阿龙的学与思阅读 418评论 0 0
  • 推荐指数: 6.0 书籍主旨关键词:特权、焦点、注意力、语言联想、情景联想 观点: 1.统计学现在叫数据分析,社会...
    Jenaral阅读 5,752评论 0 5