Java中的ThreadLocal 个人见解

在这里呢,我只简单的给大家讲一下我对于ThreadLocal的见解,以及ThreadLocal的简单使用。

一.个人对ThreadLocal的理解

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

        我觉得对于ThreadLocal的认识,一定要从“共享”两个字入手。例子是用来说明问题最好的方法,下面我列举一些例子,相信大家很快就能明白。

例一,

这是个很简单的例子,其中需要关注的是,变量a是局部变量,这个时候,线程调用方法是,同一线程调用的两个方法结果是一样的。而不同的两个线程中方法得到的结果,值是不同的。

在这里呢,A和B两个方法共享同一线程a的值,而两个线程又共享了a这一变量,但是两个线程中的a有各自不同的值。

例二,

这个例子和上个例子有一点不同就是,a成了全局变量。这个时候,无论执行多少次,两个线程调用方法得到的x和y都是一样的,只有一个值。显然这个结果和第一个例子得到的结果不一致,这不是我们想要的。

例三,

这个方法是解决例二问题的一个方法,利用Map集合,将每一个线程和其对应的值一起放到集合里面,通过匹配线程,可以得到相应的值。这时得到的结果和例一中的一样。

        但是这个方法有个问题。举个样例来说明:假设用一个HashMap来存放,由于在某些设计不当的代码中非常难知道这个HashMap写入的源头。在代码中为了保险起见,一般会先检查这个HashMap是否存在,若不存在,则创建一个HashMap写进去。若存在,通常也不会替换掉。由于代码编写者一般会“害怕”由于这样的替换会丢掉一些来自“其它地方写入HashMap的数据”。从而导致很多不可预见的问题。在这种情况下。HashMap可能開始存放很多Key-Value信息,假设存放的Key值在不断变化,那么这个HashMap就開始不断变长,并且非常可能在每一个线程中都有一个这种HashMap,这样就会逐渐地形成了间接的内存泄漏。

例四,

在这个例子中,利用了ThreadLocal中的set方法来为当前线程储存一个匹配的value,在通过执行get方法来获得该线程对应的value。此时得到的结果和例一也一致。(和Map集合原理相似)

下面说一下ThreadLocal中的三个方法:(可通过进入三个方法的代码来进一步了解)

set()方法:储存与当前线程匹配的value

get()方法:获得与当前线程匹配的value

remove()方法:移除与当前线程匹配的value

如果没有调用set()方法直接先调用了get()方法会发生什么?

如果没有先set的话,即在map中查找不到对应的value,则会通过调用setInitialValue方法返回i,而在setInitialValue方法中,有一个语句是T value = initialValue(), 而默认情况下,initialValue方法返回的是null。运行时通常会报空指针异常,可以通过重写setInitialValue来改变其默认值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值