ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适,他实现了线程的变量隔离,不同的线程可以维护自己的变量,
他在内部实现原理上比较简单,就是每个ThreadLocal内定义一个以自己线程名称为key的hashMap,在应用上非常广泛,struts2等框架的每一个Action请求都会被Web容器初始化为一个ActionContext。这样就实现了不同请求的隔离。
下面看一个Demo,通过Demo的演示大概就可以看到 ThreadLocal的应用。
主程序:
/**
* @author job
*
*/
public class ThreadLocalTest {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Runnable(){
public void run() {
Mydata.getMydata().setX(new Random().nextInt());
A.say();
}
});
service.execute(new Runnable(){
public void run() {
Mydata.getMydata().setX(new Random().nextInt());
B.say();
}
});
service.shutdown();
}
}
用作共享的参数类:
/**
* @author dingjob
*
*/
class Mydata {
private static ThreadLocal data = new ThreadLocal();
// 防止对象 被new,只能通过get的方法获得。
private Mydata(){
}
int x;
public static Mydata getMydata(){
Mydata mydata = (Mydata)data.get();
if(mydata ==null){
mydata = new Mydata();
data.set(mydata);
}
return mydata;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}
两个简单的service
class A {
public static void say(){
System.out.println(Thread.currentThread().getName()+ Mydata.getMydata().getX());
}
}
/**
* @author dingjob
*
*/
class B {
public static void say(){
System.out.println(Thread.currentThread().getName()+ Mydata.getMydata().getX());
}
}
输出结果如下:
引用
62481336
pool-1-thread-1 62481336
-1790656022
pool-1-thread-2 -1790656022
通过以上代码大概可以看到,A,B 两个线程实现了隔离,A打印出来的就是A线程初始化
的值。
顺便说一下:
上面的例子也用了下自己不太熟悉的1.5的多线程处理类。
同时在Mydata的实现了良好的封装。
ThreadLocal 可以用于session等的保存,有很广泛的用途。
分享到:
相关推荐
Quartz 是一个开源的作业调度框架,用于在 Java 应用程序中安排任务。它提供了丰富的 API 和灵活性,使得开发者可以方便地创建、管理和执行定时任务。ThreadLocal 是 Java 中的一个重要工具类,用于在多线程环境中为...
在IT行业中,Spring框架是Java开发中的核心组件,尤其在企业级应用开发中扮演着重要角色。Spring事务处理是其核心特性之一,确保了数据的一致性和完整性。本篇文章将聚焦于Spring事务处理中ThreadLocal的使用,以及...
Java 8 中的 ThreadLocal 是一个非常重要的工具类,它为每个线程提供了一个独立的变量副本,使得每个线程可以独立地改变自己的副本,而不会影响其他线程所对应的副本。这个特性在多线程编程中被广泛用于管理线程相关...
通过学习和复习这些知识点,并结合"Java-Interview-超全集合github上评分最高的jiva面试题"中的题目进行实战演练,可以有效地提升Java开发者在面试中的竞争力,为成功获得理想职位打下坚实基础。在面试准备过程中,...
这份文档详细涵盖了Java编程语言的各个方面,包括基础概念、进阶特性、并发处理、内存管理、垃圾收集、集合框架、IO流、网络编程、设计模式以及框架应用等核心知识点。以下是对这些关键领域的详细阐述: 1. **Java...
Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,尤其在处理线程间数据隔离和共享时。ThreadLocal不是线程本身,而是为每个线程提供一个独立的变量副本,使得每个线程都可以独立地改变...
在Java的面向对象基础中,封装、继承和多态是三大核心概念。封装允许隐藏内部实现细节,提高代码安全性;继承使子类能够继承父类的属性和方法,实现代码重用;多态则允许使用父类引用指向子类对象,增强了程序的灵活...
### 知识点详解:Java.lang.ThreadLocal 类 #### 一、概述 **ThreadLocal** 并非线程的一种特殊实现形式,而是一种为每个线程提供独立副本的机制,通常被称为“线程局部变量”。这种机制使得每个线程都可以独立...
首先,Java的基础知识是学习的起点,包括了解Java语言的历史、应用领域以及其与C++和C#等其他语言的区别。Java以其跨平台的特性、“一次编写,到处运行”(Write Once, Run Anywhere, WORA)的理念,吸引了大量的...
对于初学者来说,学习Java编程语言是一个很好的起点,因为它的语法清晰,具有丰富的库支持,并且广泛应用于各种领域,包括企业级应用、安卓开发和大数据处理。以下是对给定文件中各章节内容的详细解释: 1. **第一...
Java面试题是每个Java开发者在求职过程中必须面对的挑战,这些题目涵盖了广泛的Java知识领域,包括基础语法、面向对象编程、集合框架、多线程、异常处理、内存管理、JVM、网络编程、设计模式等。下面将针对这些重要...
《JAVA核心技术--高级特征(第八版)--第四部分》聚焦于Java编程语言的高级特性,这部分内容通常涉及到更复杂的编程概念和技术,是Java开发者进阶学习的重要篇章。在这一部分中,我们可以期待涵盖以下核心知识点: 1....
在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应速度。这个"基于Java的源码-超简单Java多线程填表源码.zip"文件很可能包含一个简单的示例,演示如何在Java中...
在Java编程领域,多线程并发是不可或缺的一部分,特别是在服务器端和高并发应用中。本文将深入探讨"Java并发编程-线程安全与基础构建模块"这一主题,旨在帮助开发者理解如何有效地处理并发问题,提高程序性能和稳定...
Java多线程编程是Java编程领域中的一个重要主题,它允许程序同时执行多个任务,从而提高应用程序的效率和响应性。...通过深入学习和实践,开发者可以充分利用Java的多线程特性,构建高效、稳定的应用程序。
这份“java笔试题库-选择题.rar”包含了针对Java程序员笔试的精选题目,旨在帮助备考者提升对Java语言的理解和应用能力。每个文本文件(1-70.txt、71-140.txt、141-210.txt)可能代表了一个问题集,涵盖了不同的知识...
在准备Java面试时,了解基础概念和技术细节至...总的来说,Java面试基础涵盖了广泛的领域,从语言基础到高级特性,再到工具使用和实战经验,都需要扎实的掌握。通过不断学习和实践,才能在面试中展现出自己的专业素养。