`

线程范围内数据共享

阅读更多
java实现线程范围内数据共享:
Thread.crruntThread()
使用HashMap<Thread,Object>

经过A,B,C三个模块都是获得同一个值
public class ThreadDemo20 {
	private static HashMap<Thread,Integer> data=new HashMap<Thread,Integer>();

	static class A{
		public void getData(){
			Thread t=Thread.currentThread();
			int value=data.get(t);
			System.out.println(t.getName()+" from A getData "+value);
		}
	}
	static class B{
		public void getData(){
			Thread t=Thread.currentThread();
			int value=data.get(t);
			System.out.println(t.getName()+" from B getData "+value);
		}
	}
	static class C{
		public void getData(){
			Thread t=Thread.currentThread();
			int value=data.get(t);
			System.out.println(t.getName()+" from C getData "+value);
		}
	}
	
	public static void main(String[] args) {
		for (int i = 0; i < 2; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					int value=new Random().nextInt(1000);
					data.put(Thread.currentThread(), value);
					A a1=new A();
					a1.getData();
					B b1=new B();
					b1.getData();
					C c1=new C();
					c1.getData();
				}
			}).start();;
		}
	}
}


执行结果
Thread-1 from A getData 521
Thread-1 from B getData 521
Thread-1 from C getData 521
Thread-0 from A getData 925
Thread-0 from B getData 925
Thread-0 from C getData 925

java中提供了Threadlocal类已经实现了该
Threadlocal<Integer> tl=new Threadlocal<Integer>()
t1.get();
使得该类在创建对象时候直接就是同一个线程同一个对象 对象不同线程不同,就像你登录后获得你的当前登录的用户时候不会获得别人的用户
来点实际的:
public class UserService {

	private static ThreadLocal<UserService> tl = new ThreadLocal<UserService>();

	private UserService() {}

	public static UserService getInstance() {
		UserService us = tl.get();
		if (us == null) {
			us = new UserService();
			tl.set(us);
		}
		return us;
	}

}

这个大家应该再熟悉不过了。我们使用多个线程来测试一下
public class UserServiceTest {

	public static void main(String[] args) {
		for (int i = 0; i < 4; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					A a=new A();
					a.print();
					B b=new B();
					b.print();
				}
			}).start();
		}
	}

	static class A {
		public void print() {
			UserService us = UserService.getInstance();
			System.out.println("from A "+Thread.currentThread().getName() + "..." + us);
		}
	}

	static class B {
		public void print() {
			UserService us = UserService.getInstance();
			System.out.println("from B "+Thread.currentThread().getName() + "..." + us);
		}
	}
}

测试结果是:同一个线程的UserService是相同的,不论是在A或者B中都能够获得
from A Thread-3...thread.UserService@787d6a
from A Thread-0...thread.UserService@1f4cbee
from A Thread-1...thread.UserService@1f4cbee
from A Thread-2...thread.UserService@787d6a
from B Thread-2...thread.UserService@787d6a
from B Thread-3...thread.UserService@787d6a
from B Thread-0...thread.UserService@1f4cbee
from B Thread-1...thread.UserService@1f4cbee
分享到:
评论

相关推荐

    110104010104.rar_MFC多任务_MFC多线程挂起_mfc 多线程_mfc 生产者

    信号量是一个在一定范围内变化的整形数据,用来表示一种临界资源,线程通过信号量的值来确定自己的状态是执行还是挂起,各线程间也是通过信号量机制来协调运行顺序一起完成任务,信号量的用法和互斥的用法很相似,...

    C#线程锁介绍源码

    Semaphore,AutoResetEvent和 ManuResetEvent,使用这样的机制涉及到了系统在用户模式和内核模式间的切换,性能差很多,但是他们的优点是可以跨进程同步线程,所以应该清 楚的了解到他们的不同和适用范围。...

    多线程编程指南PDF

    设置线程特定数据..............................................................................................................................31 3 获取线程特定数据........................................

    多线程编程指南(系统描述了线程标准 线程同步 多线程编程原则 等)

    删除线程特定数据键................................................................................................................. 30 3 设置线程特定数据..................................................

    Java并发编程实战

    9.4.1 线程安全的数据模型166 9.4.2 分解数据模型166 9.5 其他形式的单线程子系统167 第三部分 活跃性、性能与测试 第10章 避免活跃性危险169 10.1 死锁169 10.1.1 锁顺序死锁170 10.1.2 动态的锁顺序死锁...

    Java性能优化

    控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。 2.尽量避免随意使用静态变量 要知道,当某个对象被定义为stataic的变量所引用,那么GC通常是不会回收这个对象所占有的内存,如 ...

    谈谈Java中的ThreadLocal

    通过ThreadLocal可以将对象的可见范围限制在同一个线程内。  跳出误区  需要重点强调的的是,不要拿ThreadLocal和synchronized做类比,因为这种比较压根是无意义的!sysnchronized是一种互斥同步机制,是为了...

    并行计算导论(原书第2版).[美]Ananth Grama(带详细书签).pdf

    原版自1993年出版第1版到2003年出版第2版以来,已在世界范围内被广泛地采用为高等院校本科生和研究生的教材或参考书。 第1章 并行计算介绍 1.1 推动并行化 1.1.1 计算能力因素——从晶体管到浮点运算速度 1.1.2 ...

    jvm调优实战经验

    多功能养鱼塘-JVM内存 大鱼塘O(可分配内存): JVM可以调度使用的总的内存数,这个数量受操作系统进程寻址范围、...小池塘B(非堆内存):包括所有线程之间共享的一个方法区域和JVM为优化或内部处理所分配的内存。

    精通MFC (光盘) 源代码

    7.11.4 使用线程范围和钩子实例 7.11.5 使用全局钩子实例 7.12 小结 第8章 对话框 8.1 对话框的生存期 8.1.1 对话框的创建 8.1.2 对话框的初始化 8.1.3 对话框的消息处理 8.1.4 对话框的结束 8.2 数据交换...

    Visual C++程序开发范例宝典(光盘) 第四部分

    实例239 查询日期控件内数据 实例240 控件作为字段、操作符和内容进行查询 实例241 巧妙获取年龄 实例242 格式化金额 实例243 如何随机显示记录 9.3 查询前若干名数据 实例244 查询前10名数据 实例245 取出...

    Visual C++程序开发范例宝典(光盘) 第八部分

    实例239 查询日期控件内数据 实例240 控件作为字段、操作符和内容进行查询 实例241 巧妙获取年龄 实例242 格式化金额 实例243 如何随机显示记录 9.3 查询前若干名数据 实例244 查询前10名数据 实例245 取出...

    超级有影响力霸气的Java面试题大全文档

    例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望...

    Oracle9i的init.ora参数中文说明

    该参数的值可以是包含在双引号内的任何有效的日期格式掩码。例如: ''MMM/DD/YYYY''。 值范围: 任何有效的日期格式掩码, 但不得超过一个固定长度。 默认值: 派生 nls_timestamp_tz_format: 说明: 与 NLS_TIME_TZ_...

    java 面试题 总结

    例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望...

    成熟量产扫地机代码 STM32 FreeRTos功能完整 代码注释清晰IIC、PWM、SPI、多路ADC与DMA、IAP

    2.任务同步和互斥:STM32FreeRTos提供了任务同步和互斥的功能,可以实现多个任务之间的协作和共享数据。3.定时器和时钟管理:STM32FreeRTos提供了定时器和时钟管理的功能,能够按照预设的时间周期定时触发相应的任务...

    jsp内置对象的用法

    application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动, 直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作...

    政务服务大数据报告的技术原理分析.doc

    一定程度上的数据共享,可以有效节约时间和成本,对大数据报告的生成是非常有 利的。 数据爬取需要爬虫程序,从本质上来说,爬虫就是一个能够多线程运行的程序 。它使用HTTP协议,根据设定好的爬取规则,通过GET和...

    Java开发技术大全(500个源代码).

    readDataThread.java 读取数据的线程类 demoEnhanceThread.java 使用自己定义的线程类示例 producer_consumer.java 演示生产者-消费者线程 consumer.java 消费者线程 producer.java 生产者线程 common.java ...

Global site tag (gtag.js) - Google Analytics