`

ThreadLocal类及应用技巧

阅读更多
/**
 * ThreadLocalShareData.java
 * cn.com.songjy.test.socket.thread
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-8-16    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
*/

package cn.com.songjy.test.socket.thread;

import java.util.Random;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * ClassName:ThreadLocalShareData
 * ThreadLocal类及应用技巧
 * @author   songjy
 * @version  1.0
 * @since    v1.0
 * @Date	 2013-8-16	下午4:14:56
 */

public class ThreadLocalShareData {
	
	private static Log log = LogFactory.getLog(ThreadLocalShareData.class);
	private static ThreadLocal<Integer> thread_data = new ThreadLocal<Integer>();
	//多个变量要求在线程范围内共享可以封装到一个对象中进行存储
	private static ThreadLocal<MyThreadScopeData> my_thread_data = new ThreadLocal<MyThreadScopeData>();
	private static int data;

	public static void main(String[] args) {
		
		for(int i=0; i<5; i++)
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				data = new Random().nextInt();
				int data = new Random().nextInt();
				log.info(Thread.currentThread().getName() + " has put data :" + data);
				//thread_data.put(Thread.currentThread(), data);
				thread_data.set(data);
				//my_thread_data.set(new MyThreadScopeData(""+data, 12));
				MyThreadScopeData.getInstance().setName("name-"+data);
				MyThreadScopeData.getInstance().setAge(data);
				new A().get();
				new B().get();
			}
		}).start();
	}
	
	static class A {
		public void get(){
			//int data = thread_data.get(Thread.currentThread());
			int data = thread_data.get();
			//MyThreadScopeData my = my_thread_data.get();
			MyThreadScopeData my = MyThreadScopeData.getInstance();
			log.info("A from " + Thread.currentThread().getName() + " get data :" + data);
			log.info("A from " + Thread.currentThread().getName() + " get MyThreadScopeData :" + my.getName());
		}
	}
	
	static class B {
		public void get(){
			//int data = thread_data.get(Thread.currentThread());
			int data = thread_data.get();
			//MyThreadScopeData my = my_thread_data.get();
			MyThreadScopeData my = MyThreadScopeData.getInstance();
			log.info("B from " + Thread.currentThread().getName() + " get data :" + data);
			log.info("B from " + Thread.currentThread().getName() + " get MyThreadScopeData :" + my.getName());
		}
	}
}

//该类被编写成了线程范围内共享的数据类
class MyThreadScopeData {
	
	private MyThreadScopeData(){}
	
	/*单例之饱汉模式
	private static MyThreadScopeData instance = new MyThreadScopeData();
	public static synchronized MyThreadScopeData getInstance(){
		return instance;
	}*/
	
	/*单例之饿汉模式
	private static MyThreadScopeData instance = null;
	
	public static synchronized MyThreadScopeData getInstance(){
		
		if(null == instance)
			instance = new MyThreadScopeData();
		
		return instance;
	}*/
	
	/*线程范围内共享模式*/
	public static MyThreadScopeData getInstance(){
		
		MyThreadScopeData instance = map.get();
		
		if(null == instance) {
			instance = new MyThreadScopeData();
			map.set(instance);
		}
		
		//return map.get();//也可
		return instance;
	}
	
	private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();
	
	private String name;
	private int age;
	
	/*MyThreadScopeData(String name, int age){
		this.name = name;
		this.age = age;
	}*/
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}


引自
http://down.51cto.com/data/443416
分享到:
评论

相关推荐

    Java多线程与并发库高级应用视频教程22集

    资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统...06ThreadLocal类及应用技巧【】06ThreadLocal类及应 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    java加强笔记

    ThreadLocal类及应用技巧 - `ThreadLocal`类提供了一种线程局部变量的解决方案,可以为每个线程提供独立的变量副本。 ##### 7. 多个线程之间共享数据的方式探讨 - 可以通过显式锁、同步容器等手段来实现多个线程间...

    ThreadLocal详解

    ### ThreadLocal详解:Java多线程中的线程局部变量 #### 重要概念解析:ThreadLocal在Java多线程中的角色 ...理解并掌握ThreadLocal的工作原理和使用技巧,对于Java开发者而言,是提高多线程编程水平的关键步骤之一。

    java面试技巧及笔试汇集

    4. 线程安全:了解并发编程中的volatile、Atomic类和ThreadLocal。 六、网络编程 1. Socket通信:理解TCP和UDP协议,以及Socket和ServerSocket类的使用。 2. HTTP协议:了解HTTP的基本原理,能实现简单的HTTP客户端...

    ThreadTest.zip

    ThreadTest.zip文件显然包含了关于Java多线程API的详细讲解和实例代码,重点关注了Thread类、ThreadLocal类以及Executors类。 首先,让我们深入理解Thread类。它是Java中代表独立执行线程的基本类。每个线程都有...

    11个java面试题及面试技巧

    - 高亮个人在Java开发中的专长,如JVM优化、多线程、设计模式或框架应用等。 2. **个性优点**: - 候选人应分享他们认为有助于Java开发的优点,例如良好的逻辑思维、代码整洁性、团队合作精神、自我学习能力等。 ...

    Java常见面试题及解析电子书&Java;程序员面试技巧

    3. **并发编程**:理解线程、同步、锁机制,如synchronized、volatile、ThreadLocal,以及并发工具类如Semaphore、CountDownLatch等。 4. **异常处理**:了解异常分类,如何正确抛出和捕获异常,以及何时使用try-...

    张孝祥Java多线程与并发库高级应用笔记

    `ThreadLocal`类及应用技巧 - **功能**:提供线程局部变量,每个线程拥有独立的变量副本,避免了线程间的共享数据冲突。 - **应用**:适用于需要在线程间隔离数据的场景,例如数据库连接、用户会话等。 ##### 5. ...

    JAVA编程技巧 原代码

    5. **集合框架**:JAVA的集合框架包括List、Set、Map等接口及其实现类,理解它们的特性和应用场景,如ArrayList与LinkedList的区别,HashMap与ConcurrentHashMap的并发处理,以及如何使用泛型来提高代码安全性。...

    Java多线程程序设计-JSP教程,Java技巧及代码

    `ThreadLocal`类则提供了一种方式,让每个线程都有其独立的变量副本,避免了线程间的共享状态问题。 总的来说,Java多线程编程是构建高性能、响应快速的应用程序的关键技术,理解并掌握其原理和实践技巧对于Java...

    笔试面试题国内知名公司

    - ThreadLocal原理及应用场景 - 并发工具类:CountDownLatch、CyclicBarrier、Semaphore等 5. **Java IO/NIO** - 字节流、字符流的使用 - 文件操作 - 缓冲区、转换流 - NIO(New IO)的介绍,包括Channel、...

    如何利用Java开发高性能、高并发Web应用

    以下是一些基于给定内容的Java程序性能优化技巧: 1. **合理分配对象空间**: - 在创建对象时,了解并预估对象的大小非常重要。例如,当我们使用`Vector`时,默认构造函数会分配10个元素的空间。如果预先知道`...

    最新java面试必备技巧资料

    7. **反射**:掌握Class类的使用,动态创建对象,获取和修改私有属性及方法。 8. **设计模式**:熟悉并能灵活运用单例、工厂、观察者、装饰器、代理等常见设计模式。 9. **JVM**:理解Java虚拟机的工作原理,包括...

    java程序员面试必备大全(包含丰富的面试题目和面试技巧).rar

    Java提供了强大的多线程支持,面试中可能会涉及到线程的创建、同步、互斥、死锁等问题,以及ThreadLocal、volatile、synchronized、wait/notify等关键字的理解与应用。 四、JVM内存模型 深入理解JVM的工作原理,...

    java面试技术和技巧.zip

    理解并发容器(如ConcurrentHashMap、CopyOnWriteArrayList)的使用,线程安全问题及解决方案,以及synchronized、volatile、ThreadLocal等关键字的用法。 5. **设计模式**:熟悉常见的23种设计模式,如工厂模式、...

    java程序员-面试技巧

    - **并发编程**:了解线程的创建、同步机制,熟悉synchronized、volatile、ThreadLocal等概念。 - **集合框架**:深入理解List、Set、Map接口及其实现类,如ArrayList、LinkedList、HashMap、TreeMap等的内部工作...

    Java核心API需要掌握的程度

    ### Java核心API需要掌握的程度 Java作为一种广泛应用的编程语言,其强大的功能很大程度上依赖于其...总之,Java核心API的学习是一个逐步深入的过程,从基本的类库到高级的应用技巧都需要不断积累经验才能真正掌握。

    2 线程同步机制.md,学习代码

    6. **并发编程的应用**:压缩包中的并发编程_应用.pdf可能包含了一些实际场景下如何运用线程同步的知识,比如在数据库操作、网络请求、高并发服务器设计等方面的应用。 7. **内存泄漏与弱引用**:在JUC-ThreadLocal...

Global site tag (gtag.js) - Google Analytics