对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使用原理这里就不再赘述,网上很多。
景。
线程同步的解决方案包括:互斥同步,使用synchronized原语层面上对共享资源加锁,使用ReenTrantLock的java工具类加
锁。
非阻塞同步,非阻塞同步算法+操作系统原子操作,典型代表java.util.concurrent.atomic包中的原子类就是这么设计的,
举例,对于AtomicInteger的incrementAndGet(),不断尝试将一个当前值大1的值赋值给自己。如果失败了,说明在执行
“获取-设置”操作的时候值已经有了修改,于是再次循环进行一次操作,直到赋值成功为止。在这个过程中用到了CAS操作,
保证检查和操作的原子性。缺点:会出现ABA问题,不能涵盖所有互斥场景。
无同步方案:线程本地存储。也就是使用ThreadLocal。对于类中定义的不安全变量,可以给每一个不安全变量创建
ThreadLocal对象。将ThreadLocal对象存放在访问它的线程中,每个线程一份,使用时,互不干扰。
提出问题:1.ThreadLocal使用前提?2.使用时应该注意哪些?3.既然要创建独立的副本,为什么不直接使用protoType。
答:使用前提:线程中的独立副本之间是不需要交互的,相互之间没有依赖关系。
注意:针对原生类型,直接将将值设置到map中,对于对象,一定要创建新的对象再设置到map中,否则还是不安全
的。
最后一个疑惑:重新创建变量的代价比重新创建整个对象的代价小。
ThreadLocal使用原理这里就不再赘述,网上很多。
相关文章推荐
- ThreadLocal的一点理解
- 关于ThreadLocal的一点理解
- ThreadLocal模式的一点小理解
- ThreadLocal的一点个人理解
- 关于ThreadLocal的一点理解
- 2.7-3 Android Studio 的Gradle一点理解, 查看gradle 版本和android 插件的版本
- 彻底理解ThreadLocal
- 对管理信息系统的一点理解
- 关于openlayers中namespace的一点理解
- Java:volatile 关键字的一点理解
- 简单一点理解推挽输出与开漏输出(转)
- 正确理解ThreadLocal
- 理解ThreadLocal
- ThreadLocal的理解与在Spring中的应用
- mysql中文乱码的一点理解
- java新人浅谈对于ArrayList的一点理解
- 对JS回调函数的一点理解
- 对OAuth2的一点理解
- 对angular.js的一点理解
- 理解Threadlocal