`
xuweilovejava
  • 浏览: 8199 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ThreadLocal类及应用技巧

阅读更多
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class ThreadLocalTest {
private static Map<Thread, Integer> threadData = new HashMap<Thread, Integer>();
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();
/**
* 开启两个线程,
* 第一个线程数据共享
* 第二个线程数据共享
* @param args
*/
public static void main(String[] args) {
//开启两个线程
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {

@Override
public void run() {
int data = new Random().nextInt();
System.out.println(Thread.currentThread().getName()
+ " has put data :" + data);
threadData.put(Thread.currentThread(), data);
threadLocal.set(data);
MyThreadScopeData.getInstance().setName("name"+data);
MyThreadScopeData.getInstance().setAge(data);

new A().get();
new B().get();
}
}).start();
}



}

static class A {
public void get() {
int data = threadData.get(Thread.currentThread());
System.out.println("A1 " + Thread.currentThread().getName()
+ " has put data :" + data);
int data2 = threadLocal.get();
System.out.println("A2 " + Thread.currentThread().getName()
+ " has put data :" + data2);
MyThreadScopeData myThreadScopeData = MyThreadScopeData.getInstance();
System.out.println("A3 " + Thread.currentThread().getName()
+ " name :" + myThreadScopeData.getName() +" , age :" + myThreadScopeData.getAge() );

}
}

static class B {
public void get() {
int data = threadData.get(Thread.currentThread());
System.out.println("B " + Thread.currentThread().getName()
+ " has put data :" + data);
int data2 = threadLocal.get();
System.out.println("B2 " + Thread.currentThread().getName()
+ " has put data :" + data2);

MyThreadScopeData myThreadScopeData = MyThreadScopeData.getInstance();
System.out.println("B3 " + Thread.currentThread().getName()
+ " name :" + myThreadScopeData.getName() +" , age :" + myThreadScopeData.getAge() );

}
}

}

class MyThreadScopeData{
/*//饱汉模式
private MyThreadScopeData(){}
public static MyThreadScopeData getInstance(){
return myThreadScopeData;
}
private static MyThreadScopeData myThreadScopeData= new MyThreadScopeData();*/

/*//恶汉模式
private MyThreadScopeData(){}
public static synchronized MyThreadScopeData getInstance(){
if(myThreadScopeData==null)
myThreadScopeData = new MyThreadScopeData();
return myThreadScopeData;
}
private static MyThreadScopeData myThreadScopeData = null;*/

private MyThreadScopeData(){}
public static synchronized MyThreadScopeData getInstance(){
MyThreadScopeData instance = myThreadScopeData.get();
if(instance==null){
instance = new MyThreadScopeData();
myThreadScopeData.set(instance);
}
return instance;
}

private static ThreadLocal<MyThreadScopeData> myThreadScopeData = new ThreadLocal<MyThreadScopeData>();

private String name;
private int 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;
}

}


运行结果:
Thread-0 has put data :-412573948
Thread-1 has put data :-589943191
A1 Thread-1 has put data :-589943191
A1 Thread-0 has put data :-412573948
A2 Thread-1 has put data :-589943191
A2 Thread-0 has put data :-412573948
A3 Thread-1 name :name-589943191 , age :-589943191
A3 Thread-0 name :name-412573948 , age :-412573948
B Thread-1 has put data :-589943191
B Thread-0 has put data :-412573948
B2 Thread-1 has put data :-589943191
B2 Thread-0 has put data :-412573948
B3 Thread-1 name :name-589943191 , age :-589943191
B3 Thread-0 name :name-412573948 , age :-412573948

分享到:
评论

相关推荐

    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