理解ThreadLocal
来源:互联网 发布:python两个数组相减 编辑:程序博客网 时间:2024/05/20 17:25
ThreadLocal:线程本地存储,为每个线程都创建了变量的副本,线程在访问变量时,可以直接访问自己内部的副本变量。
理解几个概念:
在java中ThreadLocal是一个类。
ThreadMap是一个类,
Thread类是线程类。
ThreadLocal类中有一个ThreadMap的内部类。
Thread类中有一个成员变量是threadLocals
其类型为:ThreadLocalMap
ThreadLocal.ThreadLocalMap threadLocals = null;
ThreadLocalMap的key值为ThreadLocal类型。
通过ThreadLocal为threadLocals添加值:
package processthread; /** * @author wangpei * @version *创建时间:2017年3月11日 下午2:16:48 * 类说明 */public class ThreadLocalTest { public static ThreadLocal<Integer> longLocal=new ThreadLocal<Integer>(); public static void main(String[] args) { ThreadLocalTest th=new ThreadLocalTest(); ThreadLocalTest.ThreadTest thread=th.new ThreadTest (); thread.start(); ThreadLocalTest.ThreadTest2 thread2=th.new ThreadTest2 (); thread2.start(); } class ThreadTest extends Thread{ public void run(){ System.out.println("线程"+Thread.currentThread().getName()+"正在执行"); ThreadLocalTest v=new ThreadLocalTest(); v.longLocal.set(2); System.out.println(v.longLocal.get()); } } class ThreadTest2 extends Thread{ public void run(){ System.out.println("线程"+Thread.currentThread().getName()+"正在执行"); ThreadLocalTest v=new ThreadLocalTest(); v.longLocal.set(3); System.out.println(v.longLocal.get()); } } }
结果: 线程Thread-0正在执行
2
线程Thread-1正在执行
3
执行上面的结果可以看出,thread-0通过ThreadLocal写入自己的副本变量2,thread-1通过ThreadLocal写入自己的副本变量3
这两个副本变量是线程中私有的空间。
源码分析:
ThreadLocal的set方法:
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
解释:map中存放当前线程的threadLocals的值,如果map不为空,则
为map存放一个key值为当前ThreadLocal的Entry
ThreadLocalMap getMap(Thread t) { return t.threadLocals; }
ThreadLocal 的get方法:
ThreadLocalMap getMap(Thread t) { return t.threadLocals; }
返回线程t的threafLocals值。
ThreadLocal的应用:jdbc操作数据库时,建立连接,如果在多线程情况下,必须加锁实现同步,而此时,效率会大大降低。
可以为将connection写进每个线程的threadLocals中,实现同步。这样每个线程都有自己的connection副本,每个线程间互不影响。
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解Threadlocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- solr集成spring开发
- 静态变量的应用
- 虚拟机简介(一)
- Activity之间的跳转
- Ubuntu 14.04 + Tensorflow 1.0
- 理解ThreadLocal
- 如何优雅地使用Sublime Text3
- 细数云计算产品和技术-云计算安全
- iTerm2 + OhMyZsh + agnoster + Powerline + solarized = 漂亮的Mac终端
- 各种排序算法稳定性比较
- 排列组合初步学习
- 网络请求框架Retrofit
- python函数局部变量
- Java中this和super的用法总结