`

线程范围内数据共享

阅读更多
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
分享到:
评论

相关推荐

    Java多线程编程之ThreadLocal线程范围内的共享变量

    Java中的ThreadLocal是一种特殊类型的变量,它主要用于在多线程环境下提供线程范围内的局部变量。每个线程都拥有自己独立的ThreadLocal变量副本,互不影响。这与传统的全局变量不同,全局变量在所有线程间共享,可能...

    delphi多线程 读写数据

    多线程是指一个应用程序内可以同时执行多个线程(或称为子任务)的能力。这种机制允许程序同时进行多项工作,从而提高了整体的执行效率。在处理大数据文件时,多线程尤其有用,因为它能将大任务分解为小任务并行处理...

    Windows多线程编程详解

    线程间通信通常涉及数据共享和消息传递: 1. 全局变量和静态变量:共享内存区域进行通信,需配合同步机制防止数据竞争。 2. 剪贴板:可以用来在不同线程间交换数据。 3. Windows消息队列:通过PostMessage和...

    易语言线程中的变量应用

    线程间的通信和数据共享是多线程编程的关键。在易语言中,线程间的变量应用涉及到以下几个方面: 1. **全局变量**:全局变量在整个程序范围内可见,包括所有线程。当一个线程修改全局变量时,其他线程也可以立即...

    MFC线程间通信

    全局变量在整个程序范围内都是可见的,因此不同线程可以访问同一全局变量来交换数据。这种方式最简单,但也是最不安全的,因为如果没有适当的同步机制,多个线程同时读写全局变量可能导致数据不一致或者死锁。为了...

    JDK5中的多线程并发库.doc

    在JDK5中,Java引入了一套强大的多线程并发库,极大地提升了多线程编程的效率和安全...而线程范围内的数据共享,如`ThreadLocal`,则常用于存储线程局部变量,保证了各个线程之间的数据隔离,避免了不必要的同步开销。

    Posix线程编程指南

    互斥锁用于保护共享数据,防止多个线程同时访问同一数据导致的数据不一致问题。互斥锁的创建和销毁使用pthread_mutex_init()和pthread_mutex_destroy()函数,锁操作主要通过pthread_mutex_lock()和pthread_mutex_...

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

    - **概念**:线程范围内共享变量是指在线程间共享的数据,需小心处理以避免竞态条件和数据不一致性。 - **作用**:允许线程间通信和协作,但需采用适当的同步机制(如`synchronized`关键字、`Lock`接口)以确保数据...

    深入浅出Win32多线程程序设计之线程控制

    临界区是轻量级的同步机制,适用于小范围的共享数据。 线程优先级: Windows系统允许设置线程的优先级,通过`SetThreadPriority`函数可以调整线程的执行优先级。不过需要注意,过度使用高优先级线程可能导致优先级...

    采用AfxBeginThread创建工作线程

    在这个例子中,工作线程可能接收一个数字范围作为参数,然后判断这个范围内的所有数字是否为素数。线程函数可以使用`IsPrime`这样的辅助函数进行判断,并通过消息通知UI线程更新进度或结果显示。 总结,`...

    java 猜数字游戏,学习线程

    - 随机数生成线程:使用`Random`类生成一个指定范围内的随机整数,并将其存储在一个全局变量中,如`volatile`修饰的`int`类型变量,以确保线程可见性。 - 猜测线程:不断接收用户输入,与随机数进行比较,判断是否...

    linux多线程手册

    - **线程同步**:用于确保多个线程之间能够正确地协作,避免数据竞争和死锁等问题。 ##### 使用64位体系结构 - 在64位环境下,多线程编程通常能更好地利用大内存空间,提高性能。 #### 二、基本线程编程 ##### ...

    MFC多线程基础解析及例子

    在多线程环境下,数据共享和资源访问可能导致竞态条件,因此需要线程同步机制来避免冲突。MFC提供了一些同步对象,如: - **CSemaphore**:限制同时访问特定资源的线程数量。 - **CCriticalSection**:一次只允许一...

    JDK5中的多线程并发库

    5. **线程范围内共享数据**: - **应用场景**:比如银行转账,转入和转出需要共享数据。 - **解决方案**:可以使用自定义`Map`以`Thread`对象为Key保存数据,或者使用`ThreadLocal`,它为每个线程维护独立的变量...

    操作系统——线程

    操作系统中的线程是执行上下文的一个基本单位,它在进程的范围内运行,共享同一内存空间。线程模型的引入使得程序能实现并发执行,提高了系统的并行性和资源利用率。在这个主题中,我们将深入探讨线程的概念、类型、...

    QT中sqlite多线程操作4个注意问题

    具体做法是在使用`QsqlQuery`变量时将其作用域限定在一个局部范围内,例如在一个代码块内使用 `{}` 花括号明确其生命周期。例如: ```cpp { QSqlQuery query(db); if (!query.exec("SELECT * FROM table")) { ...

    关于线程(java)两天的课件

    继承Thread类的方法直接扩展Thread类,而实现Runnable接口则更适合多线程资源共享的情况,因为Java不支持多重继承。 线程的状态是理解其工作原理的关键。Java线程有五种基本状态:新建(New)、可运行(Runnable)...

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

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

Global site tag (gtag.js) - Google Analytics