ThreadLocal用法理解
2016-05-26 13:22
190 查看
ThreadLocal的理解使用
ThreadLocal工具类提供了线程私有数据的读写方法,可以放心的使用线程私有变量不必担心受到其他线程的干扰。(不能实现数据共享)常用方法: void set(T value)设置当前线程的线程局部变量的值 public T get()该方法返回当前线程所对应的线程局部变量 protected T initialValue()返回该线程局部变量的初始值
实现机制:
//首先啃一下Thread类的一个属性 //这个属性存储了线程的私有变量信息 //ThreadLocal类只是提供了方法对这个属性操作 ThreadLocal.ThreadLocalMap threadLocals = null; //set方法 public void set(T value) { //得到当前线程引用 Thread t = Thread.currentThread(); //得到当前线程的ThreadLocalMap对象 ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } //getMap ThreadLocalMap getMap(Thread t) { return t.threadLocals; } //createMap //如果map==null,新建一个 void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); } //get方法 public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); //如果已经有值,则返回 if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } //如果是第一次访问,则返回初始化方法 return setInitialValue(); } //setInitialValue private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; } //注意initialValue方法,通常在这里初始化数值 //默认返回null,所以在使用ThreadLocal的时候需要覆盖这个函数 protected T initialValue() { return null; }
使用方法:
class Run implements Runnable{ //创建对象的时候初始化值 private static ThreadLocal<Integer> local = new ThreadLocal<Integer>(){ @Override public Integer initialValue(){ return 0; } }; @Override public void run() { for(int i=0; i<10; i++){ System.out.println(Thread.currentThread().getName()+"---"+local.get()); local.set(local.get()+1); } } }
总结
ThreadLocal不能用来解决数据共享,和synchonized关键字的作用不一样。ThreadLocal的作用主要是提供了线程保持对象的方法,便于参数的传递和保持。
相关文章推荐
- C#线程间不能调用剪切板的解决方法
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- VB读取线程、句柄及写入内存的API代码实例
- C#网络编程基础之进程和线程详解
- C#通过Semaphore类控制线程队列的方法
- C#多线程处理多个队列数据的方法
- C#实现线程安全的简易日志记录方法
- C#中线程同步对象的方法分析
- ASP.NET线程相关配置
- 浅析linux环境下一个进程最多能有多少个线程
- 再谈JavaScript线程
- C#实现终止正在执行的线程
- Java线程编程中的主线程讲解