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是一种特殊类型的变量,它主要用于在多线程环境下提供线程范围内的局部变量。每个线程都拥有自己独立的ThreadLocal变量副本,互不影响。这与传统的全局变量不同,全局变量在所有线程间共享,可能...
多线程是指一个应用程序内可以同时执行多个线程(或称为子任务)的能力。这种机制允许程序同时进行多项工作,从而提高了整体的执行效率。在处理大数据文件时,多线程尤其有用,因为它能将大任务分解为小任务并行处理...
线程间通信通常涉及数据共享和消息传递: 1. 全局变量和静态变量:共享内存区域进行通信,需配合同步机制防止数据竞争。 2. 剪贴板:可以用来在不同线程间交换数据。 3. Windows消息队列:通过PostMessage和...
线程间的通信和数据共享是多线程编程的关键。在易语言中,线程间的变量应用涉及到以下几个方面: 1. **全局变量**:全局变量在整个程序范围内可见,包括所有线程。当一个线程修改全局变量时,其他线程也可以立即...
全局变量在整个程序范围内都是可见的,因此不同线程可以访问同一全局变量来交换数据。这种方式最简单,但也是最不安全的,因为如果没有适当的同步机制,多个线程同时读写全局变量可能导致数据不一致或者死锁。为了...
在JDK5中,Java引入了一套强大的多线程并发库,极大地提升了多线程编程的效率和安全...而线程范围内的数据共享,如`ThreadLocal`,则常用于存储线程局部变量,保证了各个线程之间的数据隔离,避免了不必要的同步开销。
互斥锁用于保护共享数据,防止多个线程同时访问同一数据导致的数据不一致问题。互斥锁的创建和销毁使用pthread_mutex_init()和pthread_mutex_destroy()函数,锁操作主要通过pthread_mutex_lock()和pthread_mutex_...
- **概念**:线程范围内共享变量是指在线程间共享的数据,需小心处理以避免竞态条件和数据不一致性。 - **作用**:允许线程间通信和协作,但需采用适当的同步机制(如`synchronized`关键字、`Lock`接口)以确保数据...
临界区是轻量级的同步机制,适用于小范围的共享数据。 线程优先级: Windows系统允许设置线程的优先级,通过`SetThreadPriority`函数可以调整线程的执行优先级。不过需要注意,过度使用高优先级线程可能导致优先级...
在这个例子中,工作线程可能接收一个数字范围作为参数,然后判断这个范围内的所有数字是否为素数。线程函数可以使用`IsPrime`这样的辅助函数进行判断,并通过消息通知UI线程更新进度或结果显示。 总结,`...
- 随机数生成线程:使用`Random`类生成一个指定范围内的随机整数,并将其存储在一个全局变量中,如`volatile`修饰的`int`类型变量,以确保线程可见性。 - 猜测线程:不断接收用户输入,与随机数进行比较,判断是否...
- **线程同步**:由于多个线程可能共享同一资源,因此必须通过同步机制防止数据竞争,确保数据的一致性。 #### 基本线程编程实践 - **线程库的使用**:提供了创建、控制和管理线程的API,如POSIX线程库(pthread)...
- **线程同步**:用于确保多个线程之间能够正确地协作,避免数据竞争和死锁等问题。 ##### 使用64位体系结构 - 在64位环境下,多线程编程通常能更好地利用大内存空间,提高性能。 #### 二、基本线程编程 ##### ...
在多线程环境下,数据共享和资源访问可能导致竞态条件,因此需要线程同步机制来避免冲突。MFC提供了一些同步对象,如: - **CSemaphore**:限制同时访问特定资源的线程数量。 - **CCriticalSection**:一次只允许一...
5. **线程范围内共享数据**: - **应用场景**:比如银行转账,转入和转出需要共享数据。 - **解决方案**:可以使用自定义`Map`以`Thread`对象为Key保存数据,或者使用`ThreadLocal`,它为每个线程维护独立的变量...
操作系统中的线程是执行上下文的一个基本单位,它在进程的范围内运行,共享同一内存空间。线程模型的引入使得程序能实现并发执行,提高了系统的并行性和资源利用率。在这个主题中,我们将深入探讨线程的概念、类型、...
具体做法是在使用`QsqlQuery`变量时将其作用域限定在一个局部范围内,例如在一个代码块内使用 `{}` 花括号明确其生命周期。例如: ```cpp { QSqlQuery query(db); if (!query.exec("SELECT * FROM table")) { ...
继承Thread类的方法直接扩展Thread类,而实现Runnable接口则更适合多线程资源共享的情况,因为Java不支持多重继承。 线程的状态是理解其工作原理的关键。Java线程有五种基本状态:新建(New)、可运行(Runnable)...