Java基础——线程范围内的共享数据概念和作用
2013-10-18 00:51
567 查看
问题描述:如有两个人到银行取钱,这两个人相当于两个线程,他们需要对自己账户中的钱进行操作,而这各自账户中的钱就是线程内共享的数据。两个不同线程不能访问,其他线程的数据,不然就会发生大麻烦。
下面的例子演示了,线程数据共享的问题:
data代表每个人的账户,MoubleA、MoubleB代表两个对账户的操作。两个线程就相当于两个不同的人在对自己的账户进行操作。
结果:
Thread-0在放入数据后,在进行接下来的A、B的业务操作时,并不是在对这个线程中的数据进行操作。这样就出现了线程内的数据共享问题。
下面我们用一个Map 将线程与数据关联起来:
这样我们在取数据时每次都是取到的当前线程的数据,不会出现错乱的问题。
下面的例子演示了,线程数据共享的问题:
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); } } }
这样我们在取数据时每次都是取到的当前线程的数据,不会出现错乱的问题。
相关文章推荐
- Java基础加强 线程范围内数据共享设计模式
- Java基础:多线程之线程范围内的数据共享ThreadLocal
- Java基础——ThreadLocal实现线程范围内的数据共享
- 05_张孝祥_Java多线程_线程范围内共享变量的概念与作用
- java多线程之线程范围内共享变量的概念与作用
- java多线程与线程并发四:线程范围内的共享数据
- (4)传智播客_张孝祥_线程范围内共享变量的概念与作用
- Java基础——多个线程共享数据
- 线程范围内共享变量的概念与作用演进方式
- 线程范围内共享变量的概念与作用(五)
- java多线程学习(三)---线程范围内数据共享
- Java并发05---线程范围内的共享数据
- Java线程与并发库高级应用-线程范围内共享数据ThreadLocal类
- (4)传智播客_张孝祥_线程范围内共享变量的概念与作用
- Java死锁和线程范围内共享数据
- Java高并发编程:线程范围内共享数据
- Java基础知识强化102:线程间共享数据
- 线程范围内共享变量的概念与作用
- NO.5 线程范围内共享变量的概念与作用(二)