`
hotsheqaz
  • 浏览: 19014 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
  • hi_gp: hotsheqaz 写道hi_gp 写道为啥我按照你的示例,在 ...
    XML约束
  • hotsheqaz: hi_gp 写道为啥我按照你的示例,在book.xml中加上定 ...
    XML约束
  • hi_gp: 为啥我按照你的示例,在book.xml中加上定义的book.d ...
    XML约束

线程范围内共享变量

 
阅读更多
package com.itcast;

import java.util.Random;

public class ThreadScopeShareMoney {

	/**
	 * @param args
	 */
	private static int money = 0;
	public static void main(String[] args) {
		for(int i =0;i<2;i++){
	    new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				money = new Random().nextInt();  
				System.out.println(Thread.currentThread().getName()+ " put money: " + money); 
				new A().get();
				new B().get();
			}
		}).start();
	    }
	}
	 static class A {
		public void get() {
			System.out.println("A from " + Thread.currentThread().getName()
					+ " put money:" + money);
		}
	}

	static class B {
		public void get() {
			System.out.println("B from " + Thread.currentThread().getName()
					+ " put money: " + money);
		}
	}
}

运行结果: 
Thread-1 put money: 1977754500
Thread-0 put money: -658790150
A from Thread-1 put money:-658790150
A from Thread-0 put money:-658790150
B from Thread-1 put money: -658790150
B from Thread-0 put money: -658790150

    结果发现线程0和线程-1的A和B取出都为相同的数据,出现错误,线程不同步。

 

package com.itcast;

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

public class ThreadScopeShareMoney {

	/**
	 * @param args
	 */
	private static int money = 0;
	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() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				int money = new Random().nextInt();  
				System.out.println(Thread.currentThread().getName()+ " put money: " + money); 
				threadData.put(Thread.currentThread(), money);    //把数据和当前的线程放进一个集合中,绑定线程
				new A().get();
				new B().get();
			}
		}).start();
	    }
	}
	 static class A {
		public void get() {
			int money = threadData.get(Thread.currentThread());     //取出数据
			System.out.println("A from " + Thread.currentThread().getName()
					+ " put money:" + money);
		}
	}

	static class B {
		public void get() {
			int money = threadData.get(Thread.currentThread());     //取出数据
			System.out.println("B from " + Thread.currentThread().getName()
					+ " put money: " + money);
		}
	}
}
结果为:
Thread-0 put money: 37664812
Thread-1 put money: -1336612286
A from Thread-0 put money:37664812
A from Thread-1 put money:-1336612286
B from Thread-1 put money: -1336612286
B from Thread-0 put money: 37664812

    A和B在 线程0和线程-1取出各自钱数

 

分享到:
评论

相关推荐

    Java多线程与并发库高级应用视频教程22集

    【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程范围内共享变量的概念与作用【】06ThreadLocal类及应用技巧【】06...

    Java多线程编程之ThreadLocal线程范围内的共享变量

    主要介绍了Java多线程编程之ThreadLocal线程范围内的共享变量,本文讲解了ThreadLocal的作用和目的、ThreadLocal的应用场景、ThreadLocal的使用实例等,需要的朋友可以参考下

    C#线程锁介绍源码

    只有可以被多线程访问的共享资源才需要考虑锁定,比如静态变量,再比如某些缓存中的值,而属于线程内部的变量不需要锁定。 2)多使用lock,少用Mutex 如果你一定要使用锁定,请尽量不要使用内核模块的锁定机制,...

    多线程编程指南PDF

    多线程基础介绍.........................................................................................................................................15 定义多线程术语...................................

    多线程编程指南(系统描述了线程标准 线程同步 多线程编程原则 等)

    1 多线程基础介绍15 定义多线程术语15 符合多线程标准16 多线程的益处17 提高应用程序的响应 17 有效使用多处理器17 改进程序结构17 占用较少的系统资源17 结合线程和RPC(远程过程调用)18 多线程概念18 并发性和...

    谈谈Java中的ThreadLocal

    通过ThreadLocal可以将对象的可见范围限制在同一个线程内。  跳出误区  需要重点强调的的是,不要拿ThreadLocal和synchronized做类比,因为这种比较压根是无意义的!sysnchronized是一种互斥同步机制,是为了...

    Java虚拟机.docx

    (3)局部变量是线程安全的,如果方法内部的局部变量,没有逃离方法的作用范围 (4)栈内存溢出:栈帧过多,栈帧过大 3.本地方法栈:当Java去调用一些本地的C/C++方法时使用的栈,native关键字修饰的方法是间接去调用...

    Java并发编程实战

    书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高...

    并行计算导论(原书第2版).[美]Ananth Grama(带详细书签).pdf

    原版自1993年出版第1版到2003年出版第2版以来,已在世界范围内被广泛地采用为高等院校本科生和研究生的教材或参考书。 第1章 并行计算介绍 1.1 推动并行化 1.1.1 计算能力因素——从晶体管到浮点运算速度 1.1.2 ...

    Java性能优化

    尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度的重用对象,最好能用基本的数据类型或数组来替代...

    精通MFC (光盘) 源代码

    7.11.4 使用线程范围和钩子实例 7.11.5 使用全局钩子实例 7.12 小结 第8章 对话框 8.1 对话框的生存期 8.1.1 对话框的创建 8.1.2 对话框的初始化 8.1.3 对话框的消息处理 8.1.4 对话框的结束 8.2 数据交换...

    Java开发技术大全(500个源代码).

    variableScopeExample.java 变量使用范围示例 第3章 示例描述:本章学习对象和类。 accessMember.java 访问成员变量示例 constructNoPara.java 无参数的构造方法 constructWithPara.java 带参数的构造方法 ...

    超级有影响力霸气的Java面试题大全文档

    例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望...

    jsp内置对象的用法

    10 void setAttribute(String name,Object obj,int scope) 在指定范围内设置属性及属性值 11 public Object getAttribute(String name) 取属性的值 12 Object getAttribute(String name,int scope) 在指定范围...

    java 面试题 总结

    例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望...

    java面试800题

    2.RequiredNew:当处于事务范围内的客户端应用调用组件商务方法时,EJB容器启动一个新的事务过程,组件商务方法执行在新事务过程范围内; 3.Mandatory:如果调用EJB组件商务方法的客户端应用不处于事务范围内,则...

    深入解析Windows操作系统中文.part2.rar

    系统范围的缓存数据结构 669 针对每个文件的缓存数据结构 670 11.5 文件系统接口 674 从缓存中来回拷贝数据 676 通过映射和锁定接口进行缓存 677 通过直接内存访问接口进行缓存 678 11.6 快速I/O 679 11.7 预读...

    Delphi5开发人员指南

    8.5.7 设置窗口/视区范围 196 8.5.8 关于映射模式的示范程序 197 8.6 创建一个绘画程序 202 8.7 编写动画程序 215 8.8 高级字体 221 8.8.1 Win32字体类型 222 8.8.2 基本字体元素 222 8.8.3 GDI字体分类 223 8.8.4 ...

    C# 程序设计手册(WORD)

    非对称存取子的存取范围 168 宣告和使用读取/写入属性 173 自动实作的属性 176 使用自动实作的属性来实作轻量型类别 176 方法 177 传递参数 181 传递实值型别的参数 181 传递参考型别的参数 184 了解传递结构和传递...

Global site tag (gtag.js) - Google Analytics