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
分享到:
相关推荐
信号量是一个在一定范围内变化的整形数据,用来表示一种临界资源,线程通过信号量的值来确定自己的状态是执行还是挂起,各线程间也是通过信号量机制来协调运行顺序一起完成任务,信号量的用法和互斥的用法很相似,...
Semaphore,AutoResetEvent和 ManuResetEvent,使用这样的机制涉及到了系统在用户模式和内核模式间的切换,性能差很多,但是他们的优点是可以跨进程同步线程,所以应该清 楚的了解到他们的不同和适用范围。...
线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。线程的执行开销小,但不利于资源的管理和保护。 线程的创建 POSIX 通过 pthread_create() 函数...
设置线程特定数据..............................................................................................................................31 3 获取线程特定数据........................................
删除线程特定数据键................................................................................................................. 30 3 设置线程特定数据..................................................
1. 保证线程安全的三种方法:不要跨线程访问共享变量,使用final类型的共享变量,或者将共享变量的操作加上同步。 2. 在设计类时,应该从一开始就设计成线程安全的,而不是在后期重新修复它,因为它更加容易。 3. ...
在 HotSpot 虚拟机中,锁优化和膨胀过程是两个重要的技术,旨在提高多线程之间共享数据的效率和处理竞争问题。这些技术包括自适应自旋(Adaptive Spinning)、锁删除(Lock Elimination)、锁膨胀(Lock Coarsening...
9.4.1 线程安全的数据模型166 9.4.2 分解数据模型166 9.5 其他形式的单线程子系统167 第三部分 活跃性、性能与测试 第10章 避免活跃性危险169 10.1 死锁169 10.1.1 锁顺序死锁170 10.1.2 动态的锁顺序死锁...
ServletContext 代表的是整个应用,可以获取 ServletContext 对象,域对象:在一定范围内(当前应用),使多个 Servlet 共享数据。 Servlet Context ServletContext 对象可以获取当前应用的配置信息,例如获取 ...
控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。 2.尽量避免随意使用静态变量 要知道,当某个对象被定义为stataic的变量所引用,那么GC通常是不会回收这个对象所占有的内存,如 ...
通过ThreadLocal可以将对象的可见范围限制在同一个线程内。 跳出误区 需要重点强调的的是,不要拿ThreadLocal和synchronized做类比,因为这种比较压根是无意义的!sysnchronized是一种互斥同步机制,是为了...
1. 自旋锁:由于大部分时候,锁被占用的时间很短,共享变量的锁定时间也很短,所有没有必要挂起线程,用户态和内核态的来回上下文切换严重影响性能。 2. 自适应锁:自适应锁就是自适应的自旋锁,自旋的时间不是固定...
33. 交互线程:线程之间共享某些变量,线程的执行可能影响其他线程的执行结果,有制约关系,交互线程是 Java 语言中的一种线程机制。 34. 线程互斥:某一资源同时只允许一个访问者对其进行访问,线程互斥是 Java ...
关系数据库的主要特点包括数据独立性高、数据共享性好和数据冗余小等。 在本试题中,第九个问题问的是下列四项中,不属于关系数据库特点的是。答案是数据冗余小。 10. Java Java 是一种面向对象的编程语言,用于...
原版自1993年出版第1版到2003年出版第2版以来,已在世界范围内被广泛地采用为高等院校本科生和研究生的教材或参考书。 第1章 并行计算介绍 1.1 推动并行化 1.1.1 计算能力因素——从晶体管到浮点运算速度 1.1.2 ...
多功能养鱼塘-JVM内存 大鱼塘O(可分配内存): JVM可以调度使用的总的内存数,这个数量受操作系统进程寻址范围、...小池塘B(非堆内存):包括所有线程之间共享的一个方法区域和JVM为优化或内部处理所分配的内存。
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 数据交换...
* 不同作用范围内的网络:广域网、城域网、局域网、个人区域网、高速以太网 * 网络演变思路:帧格式不变、最短帧长不变、不再使用CSMA/CD协议、向光纤转变 * CIDER(Classless Inter-Domain Routing,无分类域间路由...
实例239 查询日期控件内数据 实例240 控件作为字段、操作符和内容进行查询 实例241 巧妙获取年龄 实例242 格式化金额 实例243 如何随机显示记录 9.3 查询前若干名数据 实例244 查询前10名数据 实例245 取出...