java线程范围内的共享数据

线程范围内共享数据的作用和目的:

线程范围内的共享变量就是在一个相同的线程内部,不同的模块可以对相同的数据进行操作,但是另一个线程对同一个数据进行操作并不影响本线程。

其实就是实现两(多)个线程内部对数据实现共享,线程之间(线程外部)相互独立。

全局变量会被所有的线程都共享,现在需要实现同一个线程内不同模块间变量的共享,关于线程范围内的变量共享的举例,直接用程序代码进行时说明,创建两个线程,它们都访问了两个模块,两个模块都取值,同一个线程设置的值,只能被相同的线程获取。

以下代码会产生问题:

import java.util.HashMap;
import java.util.Map;
import java.util.Random;
 
public class ThreadScopeShareData {
	   private static  int data=0;
		public static void main(String[] args) {
		//使用循环创建两个线程
		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);			
					new A().get();//A模块取出数据
					new B().get();//B模块取出数据
				}
			}).start();
		}
	}
 
	//模块A
	static class A{
		public void get(){
		System.out.println("A from "+Thread.currentThread().getName()+" has put data: "+data);
		}
	}
 
	//模块B
	static class B{
		public void get(){
		
			System.out.println("B from "+Thread.currentThread().getName()+" has put data: "+data);
		}
	
 
}
}

两个线程之间会共享数据data,输出的时候会互相影响。

但当我们通过Map将每一个线程中的data分别存储在不同的键值对中时,就可以实现各个线程之间的独立。代码如下:

package cn.itcast.heima;
 
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
 
public class ThreadScopeShareData {
	private static Map<Thread,Integer> threadData = new HashMap<Thread,Integer>();//定义一个Map,为每一个线程存放独立数据
	public static void main(String[] args) {
		//使用循环创建两个线程
		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);
					threadData.put(Thread.currentThread(),data);
					new A().get();//A模块取出数据
					new B().get();//B模块取出数据
				}
			}).start();
		}
	}
 
	//模块A
	static class A{
		public void get(){
			int data = threadData.get(Thread.currentThread());//取出当前线程中变量的值
			System.out.println("A from "+Thread.currentThread().getName()+" has put data: "+data);
		}
	}
 
	//模块B
	static class B{
		public void get(){
			int data = threadData.get(Thread.currentThread());
			System.out.println("B from "+Thread.currentThread().getName()+" has put data: "+data);
		}
	}
 
}

    总结:多线程情况下,类变量会导致的安全问题。

猜你喜欢

转载自blog.csdn.net/yucaixiang/article/details/89182797
今日推荐