Java基础——线程范围内的共享数据概念和作用
来源:互联网 发布:网络彩票什么时候恢复 编辑:程序博客网 时间:2024/05/16 08:42
问题描述:如有两个人到银行取钱,这两个人相当于两个线程,他们需要对自己账户中的钱进行操作,而这各自账户中的钱就是线程内共享的数据。两个不同线程不能访问,其他线程的数据,不然就会发生大麻烦。
下面的例子演示了,线程数据共享的问题:
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() {// 线程中的数据@Overridepublic 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() {// 线程中的数据@Overridepublic 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
- 线程范围内的共享和作用
- 线程范围内共享变量的概念与作用
- 线程范围内共享变量的概念与作用
- 线程范围内共享变量的概念与作用
- 线程范围内共享变量的概念与作用(五)
- 线程范围内共享变量的概念与作用(六)
- 线程范围内共享变量的概念与作用
- 线程范围内共享变量的概念与作用
- 【Java多线程与并发库】5.线程范围内共享变量的概念与作用
- 【Java多线程与并发库】5.线程范围内共享变量的概念与作用
- java线程范围内的数据共享
- Java基础加强 线程范围内数据共享设计模式
- 线程范围内的数据共享
- java基础--线程03--实现线程范围内的共享变量
- Java中如何实现单个线程范围内的数据共享
- 给UIAlertView UIActionSheet 添加block支持
- Android 进程和线程模型
- 关于JavaEE
- Android 获取版本号
- 搜索引擎–基于Django/Scrapy/ElasticSearch的搜索引擎的实现
- Java基础——线程范围内的共享数据概念和作用
- Android 应用程序签名
- 在Oracle 11g中用看Oracle的共享内存段---------IPCS
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE
- android的消息处理机制--Looper,Handler,Message!
- Android 手机开机密码破解锁定
- Android常见布局简述
- Android 检测网络连接状态
- Android Market 链接的生成与分享