对ThreadLocal的一点理解

来源:互联网 发布:白苹果怎么保留数据 编辑:程序博客网 时间:2024/06/08 15:35

ThreadLocal是一个工具类,叫做线程本地变量。主要作用协助线程同步,并不能解决资源彻底共享问题,它需要一定应用场
景。
线程同步的解决方案包括:互斥同步,使用synchronized原语层面上对共享资源加锁,使用ReenTrantLock的java工具类加
锁。
非阻塞同步,非阻塞同步算法+操作系统原子操作,典型代表java.util.concurrent.atomic包中的原子类就是这么设计的,
举例,对于AtomicInteger的incrementAndGet(),不断尝试将一个当前值大1的值赋值给自己。如果失败了,说明在执行
“获取-设置”操作的时候值已经有了修改,于是再次循环进行一次操作,直到赋值成功为止。在这个过程中用到了CAS操作,
保证检查和操作的原子性。缺点:会出现ABA问题,不能涵盖所有互斥场景。
无同步方案:线程本地存储。也就是使用ThreadLocal。对于类中定义的不安全变量,可以给每一个不安全变量创建
ThreadLocal对象。将ThreadLocal对象存放在访问它的线程中,每个线程一份,使用时,互不干扰。
提出问题:1.ThreadLocal使用前提?2.使用时应该注意哪些?3.既然要创建独立的副本,为什么不直接使用protoType。
答:使用前提:线程中的独立副本之间是不需要交互的,相互之间没有依赖关系。
注意:针对原生类型,直接将将值设置到map中,对于对象,一定要创建新的对象再设置到map中,否则还是不安全
的。
最后一个疑惑:重新创建变量的代价比重新创建整个对象的代价小。
ThreadLocal使用原理这里就不再赘述,网上很多。

0 0
原创粉丝点击