快速业务通道

Java线程:深入ThreadLocal - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

Java线程:深入ThreadLocal

时间:2011-06-22 51cto 熔岩

ThreadLocal与线程成员变量还有区别,ThreadLocal该类提供了线程局部变量。这个局部变量与一般的成员变量不一样,ThreadLocal的变量在被多个线程使用时候,每个线程只能拿到该变量的一个副本,这是Java API中的描述,通过阅读API源码,发现并非副本,副本什么概念?克隆品? 或者是别的样子,太模糊。

准确的说,应该是ThreadLocal类型的变量内部的注册表(Map<Thread,T>)发生了变化,但ThreadLocal类型的变量本身的确是一个,这才是本质!

下面就做个例子:

一、标准例子

定义了MyThreadLocal类,创建它的一个对象tlt,分别给四个线程使用,结果四个线程tlt变量并没有出现共用现象,二是各用各的,这说明,四个线程使用的是tlt的副本(克隆品)。

/** * 使用了ThreadLocal的类 * * @author leizhimin 2010-1-5 10:35:27 */ public class MyThreadLocal {          //定义了一个ThreadLocal变量,用来保存int或Integer数据          private ThreadLocal<Integer> tl = new ThreadLocal<Integer>() {                  @Override                  protected Integer initialValue() {                          return 0;                  }          };          public Integer getNextNum() {                  //将tl的值获取后加1,并更新设置t1的值                  tl.set(tl.get() + 1);                  return tl.get();          } }

/** * 测试线程 * * @author leizhimin 2010-1-5 10:39:18 */ public class TestThread extends Thread {          private MyThreadLocal tlt = new MyThreadLocal();          public TestThread(MyThreadLocal tlt) {                  this.tlt = tlt;          }          @Override          public void run() {                  for (int i = 0; i < 3; i++) {                          System.out.println(Thread.currentThread().getName() + "\t" + tlt.getNextNum());                  }          } }

/** * ThreadLocal测试 * * @author leizhimin 2010-1-5 10:43:48 */ public class Test {          public static void main(String[] args) {                  MyThreadLocal tlt = new MyThreadLocal();                  Thread t1 = new TestThread(tlt);                  Thread t2 = new TestThread(tlt);                  Thread t3 = new TestThread(tlt);                  Thread t4 = new TestThread(tlt);                  t1.start();                  t2.start();                  t3.start();                  t4.start();          } }

Java线程:深入ThreadLocal(2)

时间:2011-06-22 51cto 熔岩

可以看出,三个线程各自独立编号,互不影响:

Thread-0  1 Thread-1  1 Thread-0  2 Thread-1  2 Thread-0  3 Thread-1  3 Thread-2

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号