`

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面试题及技巧4

    │ Struts+Hibernate+Spring轻量级J2EE企业应用实战.pdf │ Struts中文手册.pdf │ Struts配置文件详解.txt │ 上海税友.txt │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ ...

    java面试题及技巧3

    │ Struts+Hibernate+Spring轻量级J2EE企业应用实战.pdf │ Struts中文手册.pdf │ Struts配置文件详解.txt │ 上海税友.txt │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ ...

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

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

    王勇drp项目分析web开发分析

    掌握页面开发技术javasciprt的基本应用 掌握Ajax技术原理 掌握Tomcat链接池的配置 熟悉JFreechart的运用 了解验证码技术 熟悉上传组件的运用 掌握动态代理原理 掌握ThreadLocal原理 掌握常用的GoF和J2EE设计模式 ...

    java面试题以及技巧

    │ Struts+Hibernate+Spring轻量级J2EE企业应用实战.pdf │ Struts中文手册.pdf │ Struts配置文件详解.txt │ 上海税友.txt │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ ...

    java面试题目与技巧1

    │ Struts+Hibernate+Spring轻量级J2EE企业应用实战.pdf │ Struts中文手册.pdf │ Struts配置文件详解.txt │ 上海税友.txt │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ ...

    java面试题以及技巧6

    │ Struts+Hibernate+Spring轻量级J2EE企业应用实战.pdf │ Struts中文手册.pdf │ Struts配置文件详解.txt │ 上海税友.txt │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ ...

    疯狂JAVA讲义

    1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发...

    通向架构师的道路

    (第七天)之漫谈使用ThreadLocal改进你的层次的划分 (第八天)之weblogic与apache的整合与调优 (第九天)之weblogic的集群与配置 (第十天)之Axis2 Web Service(一) (第十一天)之Axis2 Web Service(二) (第十...

Global site tag (gtag.js) - Google Analytics