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.
相关推荐
2. **面向对象编程**:Java的核心特性是面向对象,笔记将详细讲解类、对象、封装、继承、多态等核心概念。如何定义类,如何创建和使用对象,如何通过继承和多态性实现代码复用,这些都是学习者需要掌握的关键知识点...
Java多线程笔记 Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,...
Java并发编程是Java开发中必不可少的一部分,涉及到多线程、同步机制、线程池以及并发工具类等多个核心知识点。以下是对这些主题的详细说明: 1. **线程安全与锁 Synchronized 底层实现原理**: 线程安全是指在多...
同时,Java的并发库(如synchronized、volatile、ThreadLocal等)可以帮助开发者编写安全的并发程序。 9. **反射机制**:Java的反射机制允许在运行时动态地获取类的信息,并能直接操作类的对象,是实现动态代理、...
Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...
Java源码笔记主要涵盖的是Java编程语言的核心概念和高级特性,特别是与网络编程相关的部分。在深入理解Java源码的过程中,我们不仅可以了解到语言的基础结构,还能探索其在网络通信中的应用。下面将对Java源码和网络...
4. **线程局部变量**:`ThreadLocal`类用于为每个线程提供独立的变量副本,避免了线程间的数据共享问题,提升了并发性能。 5. **并发集合**:`java.util.concurrent`包提供了线程安全的集合,如`ConcurrentHashMap`...
ThreadLocal是Java编程语言中的一个线程局部变量类,它为每个线程提供了一个独立的变量副本,使得每个线程可以独立地改变自己的副本,而不会影响其他线程所对应的副本。这个特性在多线程环境下处理并发问题时非常...
### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 1. **不要跨线程访问共享变量:** 当多个线程共享某个变量时,若其中一个线程修改了该变量,其他线程若没有正确同步,则可能读取到错误的数据。...
3. **多线程编程**:Java提供了丰富的并发工具,如synchronized关键字、volatile变量、ThreadLocal、ExecutorService等。理解和熟练运用这些工具,可以编写出高效、安全的多线程程序。 4. **集合框架**:对...
9. **并发编程改进**:JDK 5.0引入了并发工具类,如`java.util.concurrent`包下的`ExecutorService`、`Future`、`Semaphore`等,以及`ThreadLocal`,增强了多线程编程的能力。 10. **内省(Introspection)**:JDK ...
Java多线程编程是重要部分,JDK6提供了Thread类和Runnable接口,以及synchronized关键字、volatile变量和ThreadLocal等并发工具,帮助开发者构建高效、安全的并发程序。 总之,这份Java JDK6学习笔记将带你全面了解...
在Java中,实现多线程主要有两种方式:通过继承Thread类和实现Runnable接口。Thread类提供了创建新线程的基本功能,而Runnable接口则允许你在不修改类继承关系的情况下实现多线程。 1. Thread类解析:Thread类是...
最后,这个教程可能还会涵盖并发编程的增强,如并发工具类(如`java.util.concurrent`包中的`ExecutorService`、`Semaphore`等)和`java.lang.ThreadLocal`,以及`java.util.concurrent.atomic`包中的原子操作类,...
Java并发编程实践笔记 Java并发编程实践笔记是一份关于Java并发编程的实践笔记,涵盖了多种关于线程安全、并发编程的实践经验和原则。下面是从笔记中总结的知识点: 1. 保证线程安全的三种方法:不要跨线程访问...
Java并发编程:ThreadLocal、Java内存模型、锁、并发工具类、线程池等;JVM(Java虚拟机):Java内存管理详解、垃圾回收机制、垃圾回收器等;MySQL:基础知识、存储引擎、日志、SQL优化、数据索引、锁、事务、高可用...
本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...
Java高手笔记-工程师必须知道的事 本文档总结了Java开发中的一些常见问题和解决方案,涵盖了多线程、数据库事务、数据库索引、判等问题、数值计算、集合类、文件上传、日志、spring框架等方面。 并发工具 在Web...