Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 731|回复: 0

Java线程:深入ThreadLocal

[复制链接]

该用户从未签到

发表于 2011-8-5 23:54:10 | 显示全部楼层 |阅读模式
ThreadLocal与线程成员变量还有区别,ThreadLocal该类提供了线程局部变量。这个局部变量与一般的成员变量不一样,ThreadLocal的变量在被多个线程使用时候,每个线程只能拿到该变量的一个副本,这是java API中的描述,通过阅读API源码,发现并非副本,副本什么概念?克隆品? 或者是别的样子,太模糊。
  准确的说,应该是ThreadLocal类型的变量内部的注册表(Map)发生了变化,但ThreadLocal类型的变量本身的确是一个,这才是本质!
  下面就做个例子:
  一、标准例子
  定义了MyThreadLocal类,创建它的一个对象tlt,分别给四个线程使用,结果四个线程tlt变量并没有出现共用现象,二是各用各的,这说明,四个线程使用的是tlt的副本(克隆品)。

 /**
  * 使用了ThreadLocal的类
  *
  * @author leizhimin 2010-1-5 10:35:27
  */
  public class MyThreadLocal {
  //定义了一个ThreadLocal变量,用来保存int或Integer数据
  private ThreadLocal tl = new ThreadLocal() {
  @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();
  }
  }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-4-28 05:42 , Processed in 0.354500 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表