您的位置:首页 > 其它

对ThreadLocal的一点理解

2016-10-05 13:47 295 查看
ThreadLocal是一个工具类,叫做线程本地变量。主要作用协助线程同步,并不能解决资源彻底共享问题,它需要一定应用场

景。

线程同步的解决方案包括:互斥同步,使用synchronized原语层面上对共享资源加锁,使用ReenTrantLock的java工具类加

锁。

非阻塞同步,非阻塞同步算法+操作系统原子操作,典型代表java.util.concurrent.atomic包中的原子类就是这么设计的,

举例,对于AtomicInteger的incrementAndGet(),不断尝试将一个当前值大1的值赋值给自己。如果失败了,说明在执行

“获取-设置”操作的时候值已经有了修改,于是再次循环进行一次操作,直到赋值成功为止。在这个过程中用到了CAS操作,

保证检查和操作的原子性。缺点:会出现ABA问题,不能涵盖所有互斥场景。

无同步方案:线程本地存储。也就是使用ThreadLocal。对于类中定义的不安全变量,可以给每一个不安全变量创建

ThreadLocal对象。将ThreadLocal对象存放在访问它的线程中,每个线程一份,使用时,互不干扰。

提出问题:1.ThreadLocal使用前提?2.使用时应该注意哪些?3.既然要创建独立的副本,为什么不直接使用protoType。

答:使用前提:线程中的独立副本之间是不需要交互的,相互之间没有依赖关系。

注意:针对原生类型,直接将将值设置到map中,对于对象,一定要创建新的对象再设置到map中,否则还是不安全

的。

最后一个疑惑:重新创建变量的代价比重新创建整个对象的代价小。

ThreadLocal使用原理这里就不再赘述,网上很多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: