您的位置:首页 > 编程语言 > Java开发

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

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

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

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);
}
}
}


这样我们在取数据时每次都是取到的当前线程的数据,不会出现错乱的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: