`

Java threadLocal类 笔记

    博客分类:
  • JAVA
 
阅读更多

ThreadLocal 类是JDK .lang包下的一个类,该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。
简单来说,比如说一个非线程安全的对象HashMap。并且碰巧你并不需要在不同的线程中共享这个属性,也就是说这个属性不存在 跨线程的意义。那么你不要sychronize这么复杂的东西,ThreadLocal不错。

 

ThreadLocal类存在一个内部类ThreadLocalMap,该map用于维护每个线程所对应的参数,它以Thread.currentThread()为key,来存储当前线程所有需要的变量参数;

    /**
     * Sets the current thread's copy of this thread-local variable
     * to the specified value.  Most subclasses will have no need to 
     * override this method, relying solely on the {@link #initialValue}
     * method to set the values of thread-locals.
     *
     * @param value the value to be stored in the current thread's copy of
     *        this thread-local.
     */
    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

 

看一个简单的demo:起3个线程,都去调用一个公共的ThreadLocal中的HashMap,并打印。

package demo;

import java.util.HashMap;

public class ThreadLocalTest {

	public static ThreadLocal map0 = new ThreadLocal() {

		@Override
		protected HashMap initialValue() {
			System.out
					.println(Thread.currentThread().getName()
							+ " ThreadLocalTest - initialValue() - do initial with hashMap");
			return new HashMap();
		}
	};

	public void run() {
		Thread[] runItem = new Thread[3];

		for (int i = 0; i < runItem.length; i++) {
			runItem[i] = new Thread(new T1(i));
		}

		for (int i = 0; i < runItem.length; i++) {
			runItem[i].start();
		}
	}

	class T1 implements Runnable {

		int id;

		public T1(int id) {
			this.id = id;
		}

		@Override
		public void run() {
			System.out.println(Thread.currentThread().getName()
					+ " T1 - run() - start to work");
			HashMap map = map0.get();
			for (int i = 0; i < 10; i++) {
				map.put(i, i + id * 100);
				try {
					Thread.sleep(100);
				} catch (Exception ex) {
				}
			}
			System.out.println(Thread.currentThread().getName()
					+ " T1 - run() - println hashMap >> " + map);
		}

	}

	public static void main(String[] args) {
		ThreadLocalTest threadts = new ThreadLocalTest();
		threadts.run();
	}
}

 


------------------------------------------------------------------------------------
输出结果如下:
Thread-0 T1 - run() - start to work
Thread-0 ThreadLocalTest - initialValue() - do initial with hashMap
Thread-2 T1 - run() - start to work
Thread-2 ThreadLocalTest - initialValue() - do initial with hashMap
Thread-1 T1 - run() - start to work
Thread-1 ThreadLocalTest - initialValue() - do initial with hashMap
Thread-0 T1 - run() - println hashMap >> {0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}
Thread-1 T1 - run() - println hashMap >> {0=100, 1=101, 2=102, 3=103, 4=104, 5=105, 6=106, 7=107, 8=108, 9=109}
Thread-2 T1 - run() - println hashMap >> {0=200, 1=201, 2=202, 3=203, 4=204, 5=205, 6=206, 7=207, 8=208, 9=209}

很明显可以看出,虽然Thread-0、Thread-1、Thread-2 都是共享一个ThreadLocal,但是每个线程都在操作自己的HashMap.

分享到:
评论

相关推荐

    传智博客JAVA基础笔记个人总结

    2. **面向对象编程**:Java的核心特性是面向对象,笔记将详细讲解类、对象、封装、继承、多态等核心概念。如何定义类,如何创建和使用对象,如何通过继承和多态性实现代码复用,这些都是学习者需要掌握的关键知识点...

    Java多线程笔记

    Java多线程笔记 Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,...

    Java并发编程学习笔记

    Java并发编程是Java开发中必不可少的一部分,涉及到多线程、同步机制、线程池以及并发工具类等多个核心知识点。以下是对这些主题的详细说明: 1. **线程安全与锁 Synchronized 底层实现原理**: 线程安全是指在多...

    张龙老师Java SE课堂笔记和文档

    同时,Java的并发库(如synchronized、volatile、ThreadLocal等)可以帮助开发者编写安全的并发程序。 9. **反射机制**:Java的反射机制允许在运行时动态地获取类的信息,并能直接操作类的对象,是实现动态代理、...

    java线程学习笔记

    Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...

    java源码笔记

    Java源码笔记主要涵盖的是Java编程语言的核心概念和高级特性,特别是与网络编程相关的部分。在深入理解Java源码的过程中,我们不仅可以了解到语言的基础结构,还能探索其在网络通信中的应用。下面将对Java源码和网络...

    Java并发编程学习笔记.rar

    4. **线程局部变量**:`ThreadLocal`类用于为每个线程提供独立的变量副本,避免了线程间的数据共享问题,提升了并发性能。 5. **并发集合**:`java.util.concurrent`包提供了线程安全的集合,如`ConcurrentHashMap`...

    threadLocal

    ThreadLocal是Java编程语言中的一个线程局部变量类,它为每个线程提供了一个独立的变量副本,使得每个线程可以独立地改变自己的副本,而不会影响其他线程所对应的副本。这个特性在多线程环境下处理并发问题时非常...

    java并发编程实践笔记

    ### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 1. **不要跨线程访问共享变量:** 当多个线程共享某个变量时,若其中一个线程修改了该变量,其他线程若没有正确同步,则可能读取到错误的数据。...

    Java避坑指南:Java高手笔记代码篇.rar

    3. **多线程编程**:Java提供了丰富的并发工具,如synchronized关键字、volatile变量、ThreadLocal、ExecutorService等。理解和熟练运用这些工具,可以编写出高效、安全的多线程程序。 4. **集合框架**:对...

    良葛格Java JDK 5.0学习笔记fuluB

    9. **并发编程改进**:JDK 5.0引入了并发工具类,如`java.util.concurrent`包下的`ExecutorService`、`Future`、`Semaphore`等,以及`ThreadLocal`,增强了多线程编程的能力。 10. **内省(Introspection)**:JDK ...

    Java JDK6学习笔记[ppt]

    Java多线程编程是重要部分,JDK6提供了Thread类和Runnable接口,以及synchronized关键字、volatile变量和ThreadLocal等并发工具,帮助开发者构建高效、安全的并发程序。 总之,这份Java JDK6学习笔记将带你全面了解...

    Java多线程源码笔记.pdf

    在Java中,实现多线程主要有两种方式:通过继承Thread类和实现Runnable接口。Thread类提供了创建新线程的基本功能,而Runnable接口则允许你在不修改类继承关系的情况下实现多线程。 1. Thread类解析:Thread类是...

    良葛格java jdk 5.0学习笔记

    最后,这个教程可能还会涵盖并发编程的增强,如并发工具类(如`java.util.concurrent`包中的`ExecutorService`、`Semaphore`等)和`java.lang.ThreadLocal`,以及`java.util.concurrent.atomic`包中的原子操作类,...

    java并发编程实践笔记资料.pdf

    Java并发编程实践笔记 Java并发编程实践笔记是一份关于Java并发编程的实践笔记,涵盖了多种关于线程安全、并发编程的实践经验和原则。下面是从笔记中总结的知识点: 1. 保证线程安全的三种方法:不要跨线程访问...

    免费分享 Java面试笔记 面试八股文 计算机网络基础

    Java并发编程:ThreadLocal、Java内存模型、锁、并发工具类、线程池等;JVM(Java虚拟机):Java内存管理详解、垃圾回收机制、垃圾回收器等;MySQL:基础知识、存储引擎、日志、SQL优化、数据索引、锁、事务、高可用...

    多线程-狂神说Java学习笔记

    本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...

    Java高手笔记-工程师必须知道的事

    Java高手笔记-工程师必须知道的事 本文档总结了Java开发中的一些常见问题和解决方案,涵盖了多线程、数据库事务、数据库索引、判等问题、数值计算、集合类、文件上传、日志、spring框架等方面。 并发工具 在Web...

Global site tag (gtag.js) - Google Analytics