线程范围内访问变量,hashmap实现线程内数据同步

先看一个示例,运行如下。
package DuoXianCheng;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class ThreadScopeShareDate {
private static int data=0;
private static Map<Thread,Integer> map = new HashMap<Thread,Integer>();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i=0;i<2;i++){
new Thread (new Runnable(){
public void run(){
  data=new  Random().nextInt();   
System.out.println(Thread.currentThread().getName()+"has put data:"+data);
//  map.put(Thread.currentThread(), data);
new A().get();
new B().get();
}
}).start();
}

}
static class A 
{
public int get (){
// int data=map.get(Thread.currentThread());
System.out.println("A FROM "+Thread.currentThread().getName()+" has get data:"+data);
return data;

}
static class B 
{
public int get (){
// int data=map.get(Thread.currentThread());
System.out.println("B FROM "+Thread.currentThread().getName()+" has get data:"+data);
 return data;

}
}




输出结果:在线程0中产生data为-499510563,
 但在“A FROM Thread-0has
 get data:-1733776812”A在线程0的范围内获得的缺失
线程1产生的数据。这里就产生了方法A没有在线程0范围内使用变量的问题。
正常情况向应该是在线程0范围内产生的数据,在线程0范围内的任何方法都应该使用同一个变量值。
Thread-0has put data:-499510563
Thread-1has put data:-1733776812
A FROM Thread-1 has get data:-1733776812
A FROM Thread-0 has get data:-1733776812
B FROM Thread-0 has get data:-1733776812
B FROM Thread-1 has get data:-1733776812


示例二,采用hashmap存储数据保证线程安全
package DuoXianCheng;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class ThreadScopeShareDate {
private static int data=0;
private static Map<Thread,Integer> map = new HashMap<Thread,Integer>();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i=0;i<2;i++){
new Thread (new Runnable(){
public void run(){
int data=new  Random().nextInt();   
System.out.println(Thread.currentThread().getName()+"has put data:"+data);
 map.put(Thread.currentThread(), data);
new A().get();
new B().get();
}
}).start();
}

}
static class A 
{
public int get (){
int data=map.get(Thread.currentThread());
System.out.println("A FROM "+Thread.currentThread().getName()+" has get data:"+data);
return data;

}
static class B 
{
public int get (){
int data=map.get(Thread.currentThread());
System.out.println("B FROM "+Thread.currentThread().getName()+" has get data:"+data);
return data;

}
}


输出结果:可以看到在线程0或者1范围内产生的值和,A/B在该线程内获得的值一致。
Thread-1has put data:-2078181451
Thread-0has put data:-1035167699
A FROM Thread-1 has get data:-2078181451
A FROM Thread-0 has get data:-1035167699
B FROM Thread-0 has get data:-1035167699
B FROM Thread-1 has get data:-2078181451

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在面试中,常常会涉及到关于多线程的问题。下面是一些常见的多线程面试题及其答案: 1. 多线程有什么用? 多线程的主要作用是提高程序的并发性和响应性。通过使用多线程,可以同时执行多个任务,从而提高程序的处理效率和性能。此外,多线程还可以实现并行计算、异步操作和资源共享等功能。 2. 线程和进程的区别是什么? 线程和进程都是并发执行的执行单位,但它们有以下区别: - 进程是操作系统分配资源的最小单位,每个进程拥有独立的地址空间和系统资源,进程之间的通信需要使用进程间通信(IPC)机制。 - 线程是进程内的执行单元,线程共享进程的地址空间和系统资源,线程之间可以通过共享变量进行通信。 - 创建和销毁进程的开销比较大,切换进程的开销也比较大,而线程的创建、销毁和切换开销比较小。 - 多进程程序相对比较稳定,但开销较大;多线程程序相对较快,但对于共享变量访问需要注意同步和互斥。 3. Java 实现线程有哪几种方式? 在Java中,可以通过以下几种方式实现线程: - 继承 Thread 类实现线程。 - 实现 Runnable 接口方式实现线程。 - 使用 ExecutorService、Callable、Future 实现有返回结果的多线程。 4. 启动线程方法 start() 和 run() 有什么区别? start() 方法用于启动一个新的线程,并在新的线程中执行 run() 方法。它会在后台创建一个新的线程,使得新线程可以并发执行。而直接调用 run() 方法并不

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值