Java线程:深入ThreadLocal

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();
         }
}

时间: 2024-10-29 17:19:26

Java线程:深入ThreadLocal的相关文章

简单分析Java线程编程中ThreadLocal类的使用_java

一.概述  ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLocalVar更加合适.线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.   从线程的角度看,每个线程都保持一个对其

Java线程范围变量——ThreadLocal的模拟和解释

一.测试代码 public class XY_ThreadData {  private static Integer data = 0;  private static Map<Thread, Integer> map = new HashMap<Thread, Integer>();  private static ThreadLocal<Integer> local = new ThreadLocal<Integer>();  public stati

Java线程系列

Java线程:线程私有变量 Java线程:深入ThreadLocal Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新

Java线程面试题 Top 50

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.优化经验,所以线程相关的问题在面试中经常会 被提到. 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问题像

java线程的6种状态以及相互转换

一.线程如何创建 创建线程有三种方式:继承Thread类:无返回值的Runnable:有返回值的Callable 示例如下 package com.rcl.platform.demo; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class CreateThread { pub

Java线程面试题 Top 50(转)

  不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.优化经验,所以线程相关的问题在面试中经常会被提到. 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问题像

Java线程试题Top50

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.优化经验,所以线程相关的问题在面试中经常会被提到. 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问题像在J

理解java中的ThreadLocal 专题

ThreadLocal每一印象: public class IncrementWithStaticVariable{ private static int seqNum = 0; public int getNextNum(){ seqNum ++; return seqNum; } public static void main(String[] args) { IncrementWithStaticVariablesn = new IncrementWithStaticVariable();

50 道Java 线程面试题(经典)_java

下面是 Java 线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要 100 毫秒,那么用十个线程完成改任务只需 10 毫秒.Java 在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点.欲了解更多详细信息请点击这里. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很

经典Java线程面试题70道

下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务.不同的进