`

线程范围内数据共享

阅读更多
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,使用这样的机制涉及到了系统在用户模式和内核模式间的切换,性能差很多,但是他们的优点是可以跨进程同步线程,所以应该清 楚的了解到他们的不同和适用范围。...

    Linux多线程编程的基本的函数-Posix线程编程指南

    线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。线程的执行开销小,但不利于资源的管理和保护。 线程的创建 POSIX 通过 pthread_create() 函数...

    多线程编程指南PDF

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

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

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

    java并发编程实践笔记资料.pdf

    1. 保证线程安全的三种方法:不要跨线程访问共享变量,使用final类型的共享变量,或者将共享变量的操作加上同步。 2. 在设计类时,应该从一开始就设计成线程安全的,而不是在后期重新修复它,因为它更加容易。 3. ...

    JAVA锁优化和膨胀过程.docx

    在 HotSpot 虚拟机中,锁优化和膨胀过程是两个重要的技术,旨在提高多线程之间共享数据的效率和处理竞争问题。这些技术包括自适应自旋(Adaptive Spinning)、锁删除(Lock Elimination)、锁膨胀(Lock Coarsening...

    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 Web 笔记总结

    ServletContext 代表的是整个应用,可以获取 ServletContext 对象,域对象:在一定范围内(当前应用),使多个 Servlet 共享数据。 Servlet Context ServletContext 对象可以获取当前应用的配置信息,例如获取 ...

    Java性能优化

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

    谈谈Java中的ThreadLocal

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

    JAVA面试问题,随便看看

    1. 自旋锁:由于大部分时候,锁被占用的时间很短,共享变量的锁定时间也很短,所有没有必要挂起线程,用户态和内核态的来回上下文切换严重影响性能。 2. 自适应锁:自适应锁就是自适应的自旋锁,自旋的时间不是固定...

    java考试题库(大二期末考试必备).doc

    33. 交互线程:线程之间共享某些变量,线程的执行可能影响其他线程的执行结果,有制约关系,交互线程是 Java 语言中的一种线程机制。 34. 线程互斥:某一资源同时只允许一个访问者对其进行访问,线程互斥是 Java ...

    中国平安银行关于软件测试笔试试题.doc

    关系数据库的主要特点包括数据独立性高、数据共享性好和数据冗余小等。 在本试题中,第九个问题问的是下列四项中,不属于关系数据库特点的是。答案是数据冗余小。 10. Java Java 是一种面向对象的编程语言,用于...

    并行计算导论(原书第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 数据交换...

    硕士研究生计算机复试专业面试相关题目.pdf

    * 不同作用范围内的网络:广域网、城域网、局域网、个人区域网、高速以太网 * 网络演变思路:帧格式不变、最短帧长不变、不再使用CSMA/CD协议、向光纤转变 * CIDER(Classless Inter-Domain Routing,无分类域间路由...

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

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

Global site tag (gtag.js) - Google Analytics