Java基础——线程范围内的共享数据概念和作用

本文通过银行取款的场景模拟,展示了多线程环境下如何解决数据共享问题,使用Map实现线程间的变量隔离,确保每个线程都能正确访问自身数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:如有两个人到银行取钱,这两个人相当于两个线程,他们需要对自己账户中的钱进行操作,而这各自账户中的钱就是线程内共享的数据。两个不同线程不能访问,其他线程的数据,不然就会发生大麻烦。

下面的例子演示了,线程数据共享的问题:

package com.flyingduck.thread;

import java.util.Random;

public class ThreadScopeSharaData {

	private static int data = 0;

	public static void main(String[] args) {
		for (int i = 0; i < 2; i++) {
			new Thread(new Runnable() {
				// 线程中的数据
				@Override
				public void run() {
					data = new Random().nextInt();
					System.out.println(Thread.currentThread().getName()
							+ " put data = " + data);
					new MoudleA().getData();
					new MoudleB().getData();
				}
			}).start();
		}
	}

	static class MoudleA {

		public void getData() {
			System.out.println("Moudle A get "
					+ Thread.currentThread().getName() + " data = " + data);
		}
	}

	static class MoudleB {
		public void getData() {
			System.out.println("Moudle B get "
					+ Thread.currentThread().getName() + " data = " + data);
		}
	}
}

data代表每个人的账户,MoubleA、MoubleB代表两个对账户的操作。两个线程就相当于两个不同的人在对自己的账户进行操作。

结果:


Thread-0在放入数据后,在进行接下来的A、B的业务操作时,并不是在对这个线程中的数据进行操作。这样就出现了线程内的数据共享问题。


下面我们用一个Map 将线程与数据关联起来:

package com.flyingduck.thread;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class ThreadScopeSharaData {

	//
	private static Map<Thread, Integer> threadMap = new HashMap<Thread,Integer>();
	
	public static void main(String[] args) {
		for (int i = 0; i < 2; i++) {
			new Thread(new Runnable() {
				// 线程中的数据
				@Override
				public void run() {
					int data = new Random().nextInt();
					threadMap.put(Thread.currentThread(), data);
					System.out.println(Thread.currentThread().getName()
							+ " put data = " + data);
					new MoudleA().getData();
					new MoudleB().getData();
				}
			}).start();
		}
	}

	static class MoudleA {

		public void getData() {
			int data = threadMap.get(Thread.currentThread());
			System.out.println("Moudle A get "
					+ Thread.currentThread().getName() + " data = " + data);
		}
	}

	static class MoudleB {
		public void getData() {
			int data = threadMap.get(Thread.currentThread());
			System.out.println("Moudle B get "
					+ Thread.currentThread().getName() + " data = " + data);
		}
	}
}

这样我们在取数据时每次都是取到的当前线程的数据,不会出现错乱的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值