ThreadLocal这个类,理解起来比较简单,但是使用时,还是需要一些技巧的,简单介绍如下:
例子1:threadLocal变量一般用法
package concurrent.thread;
/**
* 技巧:
* 1.在当前线程里执行threadLocal.set(value) 相当于 currentThread.threadLocalMap.set(threadLocal,value)。
* 即:每个线程均含有一个threadLocalMap变量,该变量由ThreadLocal维护。
* 2.ThreadLocal变量一般使用private static修饰。
*/
public class ThreadLocalDemo_step0 {
private static ThreadLocal<String> myData = new ThreadLocal<String>();
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable(){
public void run() {
System.out.println("Thread " + Thread.currentThread().getName() + "[begin] has " + myData.get());
myData.set("t1");
System.out.println("Thread " + Thread.currentThread().getName() + "[end] has " + myData.get());
}
});
Thread t2 = new Thread(new Runnable(){
public void run() {
System.out.println("Thread " + Thread.currentThread().getName() + "[begin] has " + myData.get());
myData.set("t2");
System.out.println("Thread " + Thread.currentThread().getName() + "[end] has " + myData.get());
}
});
t1.start();
t2.start();
}
}
例子2:threadLocal变量的简单封装用法(重要)
package concurrent.thread;
/**
* 技巧:
* 3.如果希望线程局部变量初始化其它值,那么需要自己实现ThreadLocal的子类并重写initialValue()方法,
* 通常使用一个内部匿名类对ThreadLocal进行子类化.比如下面的例子,SerialNum类为每一个类分配一个序号:
*/
public class ThreadLocalDemo_step1 {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable(){
public void run() {
System.out.println("Thread " + Thread.currentThread().getName() + " has " + SerialNum.get());
}
});
Thread t2 = new Thread(new Runnable(){
public void run() {
System.out.println("Thread " + Thread.currentThread().getName() + " has " + SerialNum.get());
}
});
t1.start();
t2.start();
}
//技巧:对threadLocal变量进行简单封装,可以简化多线程操作
static class SerialNum {
// The next serial number to be assigned
private static int nextSerialNum = 0;
private static ThreadLocal serialNum = new ThreadLocal() {
protected synchronized Object initialValue() {
return new Integer(nextSerialNum++);
}
};
public static int get() {
return ((Integer) (serialNum.get())).intValue();
}
}
}
参考文献:
http://my.oschina.net/ITBoy/blog/17190 java类ThreadLocal的理解
http://www.iteye.com/topic/103804 正确理解ThreadLocal
分享到:
相关推荐
总之,“java并发编程-从入门到精通”这个文档会覆盖以上所有内容,并可能深入讲解更多高级主题,如原子类(Atomic*)、线程局部变量(ThreadLocal)、中断线程机制以及死锁预防等。通过学习这份文档,你将能够熟练...
本文将深入探讨"Java并发编程-线程安全与基础构建模块"这一主题,旨在帮助开发者理解如何有效地处理并发问题,提高程序性能和稳定性。 首先,线程安全是并发编程中的核心概念,指的是多个线程访问同一资源时,无论...
Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...
《JAVA并发编程实践》是一本深入探讨Java多线程编程技术的专业书籍,旨在帮助开发者理解和掌握在Java平台上进行高效并发编程的关键知识。本书涵盖了从基本概念到高级特性的全面内容,是Java程序员进阶的必读之作。 ...
Java并发编程学习之ThreadLocal源码详析 ThreadLocal是Java并发编程中的一种机制,用于解决多线程访问共享变量的问题。它可以使每个线程对共享变量的访问都是线程安全的,使得多线程编程变得更加简单。 ...
### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 ...通过上述知识点的学习,我们可以更好地理解和掌握Java并发编程的基本原理和技巧,为开发高效稳定的并发应用程序打下坚实的基础。
Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...
根据给定文件的信息“JAVA并发编程实践”以及其描述为“Java并发学习资料”,我们可以从中提炼出关于Java并发编程的一些核心知识点。Java并发编程是Java高级特性之一,它允许开发者编写能够同时执行多个任务的程序,...
在Java的并发编程中,ThreadLocal是一个非常重要的概念,它可以帮助我们创建独立于线程的变量副本,避免了在多线程共享数据时可能出现的竞态条件。 1. **ThreadLocal的工作原理**: - 每个ThreadLocal实例都会为每...
5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6 构建高效且可伸缩的结果缓存 第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1...
《Java并发编程艺术》这本书是Java开发者深入理解多线程编程的重要参考资料。它全面而深入地探讨了Java平台上的并发编程技术,对于提升程序性能、优化系统资源利用以及解决多线程环境中的复杂问题有着极大的帮助。...
Java并发编程是Java开发者必须掌握的关键技能之一,尤其是在多核处理器和分布式系统广泛使用的今天。以下是对标题和描述中提及的两本经典书籍——《Concurrent Programming in Java》和《Java Concurrency in ...
《Java并发编程1-9章》是一份涵盖了Java并发编程核心知识的资料集合,主要源自博客作者Yishizhu在iteye上的分享。通过阅读这些章节,我们可以深入了解Java平台上的多线程和并发处理机制,这对于任何需要处理高性能、...
本篇文章将深入探讨Java并发编程的相关知识点,主要基于提供的两个文件——"Java并发编程实战(中文版).pdf"和"Java Concurrency in Practice.pdf"。 1. **线程与并发** - **线程基础**:Java中的线程是并发执行...
Java并发编程是Java开发中的重要领域,涉及到多...总结来说,Java并发编程通过线程池管理和ThreadLocal机制,提供了高效且安全的多线程环境。理解并熟练掌握这些概念和技术,对于编写高性能的Java应用程序至关重要。
1. **并发基础**:介绍Java并发编程的基本概念,包括线程、进程、同步与互斥、死锁等。读者将了解Java中Thread类和Runnable接口的使用,以及如何创建和管理线程。 2. **线程安全**:讨论线程不安全的代码示例,以及...