1. package ltb20180106;
  2.  
  3. public class TestBankThread {
  4.  
  5. private int deposit=0;//注意全局变量的摆放.
  6.  
  7. public TestBankThread() {
  8.  
  9. }
  10.  
  11. class BankThread implements Runnable{
  12.  
  13. public BankThread() {
  14.  
  15. }
  16.  
  17. public void setDeposit(int money) {
  18.  
  19. deposit+=money;
  20.  
  21. }
  22.  
  23. public int getMoney(int m) {
  24.  
  25. deposit=deposit-m;
  26.  
  27. if(deposit<0) {
  28.  
  29. System.out.println("ATM余额不足!!!"+deposit);
  30.  
  31. }
  32.  
  33. return m;
  34. }
  35.  
  36. public int getBank() {
  37.  
  38. return deposit;
  39. }
  40.  
  41. public void run() {
  42.  
  43. this.setDeposit(200);
  44.  
  45. System.out.println("ATM现有存款"+this.getBank());
  46.  
  47. }
  48. }
  49.  
  50. class A extends BankThread {
  51.  
  52. private int a=0;
  53.  
  54. public A() {
  55.  
  56. }
  57.  
  58. public void setA(int i) {
  59.  
  60. a=a+i;
  61. }
  62.  
  63. public int getA() {
  64.  
  65. return a;
  66. }
  67.  
  68. public void run() {
  69.  
  70. this.setA(super.getMoney(200));
  71. System.out.println("A从ATM取出:"+this.getA());
  72. System.out.println("ATM现在是"+this.getBank());
  73. this.setA(100);
  74. System.out.println("在存入A100元最后是:"+a);
  75. super.setDeposit(getA());
  76. System.out.println("存入ATM后:"+super.getBank());
  77. }
  78.  
  79. }
  80.  
  81. class B extends BankThread {
  82.  
  83. private int b=0;//余额
  84. private int k=0;//取款数额
  85. public B() {
  86.  
  87. }
  88.  
  89. public void setB(int i) {
  90.  
  91. b=b+i;
  92. }
  93.  
  94. public int getB(int j) {
  95.  
  96. b=b-j;
  97.  
  98. if(j>b) {
  99.  
  100. System.out.println("类B:余额不足了");
  101. }
  102.  
  103. k=j;
  104.  
  105. return j;
  106. }
  107.  
  108. public int getB() {
  109.  
  110. return b;
  111.  
  112. }
  113.  
  114. public int getK() {
  115.  
  116. return k;
  117. }
  118.  
  119. public void run() {
  120.  
  121. this.setB(super.getMoney(300));
  122. System.out.println("B从ATM取走"+this.getB()+"元");
  123. this.getB(50);
  124. super.setDeposit(this.getB());
  125. System.out.println("B取款"+this.getK()+"元,花掉了.");
  126. System.out.println("ATM当前存款:"+super.getBank());
  127.  
  128. }
  129.  
  130. }
  131.  
  132. public static void main(String[] args) {
  133.  
  134. TestBankThread tb=new TestBankThread();
  135.  
  136. Thread t1=new Thread(tb.new BankThread());
  137. t1.start();
  138. Thread t2=new Thread(tb.new A());
  139. t2.start();
  140. Thread t3=new Thread(tb.new B());
  141. t3.start();
  142.  
  143. }
  144.  
  145. }

多线程练习,深刻体会了一次变量的BUG.的更多相关文章

  1. Java多线程编程(二)对象及变量的并发访问

    一.synchronized同步方法 1.方法内的变量为线程安全 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的了. 示例: ...

  2. 【Linux C 多线程编程】互斥锁与条件变量

    一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1) 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态 ...

  3. 谈谈装xp官方纯净系统屡次失败的深刻体会

    有木有,小硬盘小内存的电脑竟然装不了五六百m大小的xp却能装win7之类的而感到痛失,如果去装win7电脑果断卡死, 用了最流行的制作u盘启动的软件都不行, 任何直接点击安装也不行,点不了安装的那个选 ...

  4. 多线程:QueueUserWorkItem引发的闭包与变量共享

    //1. public void SaveModel(testmodel msg) { ThreadPool.QueueUserWorkItem(new WaitCallback(SaveModelT ...

  5. 多线程_先产后销_运行结果有BUG

    class Shop { public static void main(String[] args) { Things t=new Things(); Custom c=new Custom(t); ...

  6. 【腾讯Bugly干货分享】安卓单元测试:What, Why and How

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d28349101cd07a5404c415 Dev Club 是一个交流移动 ...

  7. 我是如何拿到蚂蚁金服 offer 的 ?

    阅读本文大概需要 5.6 分钟. 作者:翟洪毅 一.梦想和被拒 二.积累 三.结语   首先介绍一下投稿作者 翟洪毅,16年华理计算机本科毕业.在年前拿到了蚂蚁金服Java开发的offer,P6. 工 ...

  8. java多线程系列(二)---对象变量并发访问

    对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...

  9. Java多线程之非线程安全

    在Java多线程中我会重点总结五个如下的技术点: 1.非线程安全是如何出现的 2.synchronized对象监视器为Objec时的使用 3.synchronized对象监视器为Class时的使用 4 ...

随机推荐

  1. 倍增求lca

    /* 节点维护的信息多样 如果用树状数组维护到根节点的边权或者点权, 可以直接插入点权和边权值,不需要预处理, 但是记得一定要使用ot[]消除影响.即差分. Housewife Wind 这个坑踩得死 ...

  2. ZOJ 1002:Fire Net(DFS+回溯)

    Fire Net Time Limit: 2 Seconds      Memory Limit: 65536 KB Suppose that we have a square city with s ...

  3. Prime Test(POJ 1811)

    素数判定的模板题,运用米勒-罗宾素数判定,然后用Pollard_Rho法求出质因数.使用相应的模板即可,不过注意存储质因子的数组需要使用vector,并且使用long long类型存储,不然存储不下, ...

  4. Linux,IDS入侵防御系统

    https://www.comparitech.com/net-admin/network-intrusion-detection-tools/11 2018年的顶级入侵检测工具 https://op ...

  5. linux磁盘检测和修复

    显示磁盘和闪存的信息,以及分区信息 [root@bogon shell]# fdisk -l Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 s ...

  6. JDBC事务的处理-----模拟银行转账业务

    定义: 数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 概要: 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: ...

  7. UWP --- Display Content 显示基础内容

    UWP前端使用的是XAML语言, 这门语言和Xamarin Forms 是比较类似(当你开发多了之后会发现StackPanel和StackLayout傻傻的分不清) 言归正传. UWP中显示内容最简单 ...

  8. taro 知识点

    taro 的包: 包名 说明 @tarojs/redux Redux for Taro @tarojs/redux-h5 Forked react-redux for taro @tarojs/plu ...

  9. vue 和 react 组件间通信方法对比

    vue 和 react 组件间通信方法对比: 通信路径 vue的方法 react的方法 父组件 => 子组件 props(推荐).slot(推荐).this.$refs.this.$childr ...

  10. OpenGL纹理

    如果不用头文件,把所有东西堆在同一个cpp文件中,会出现“超出GPU内存的错误!” 1 //我们自己的着色器类 #ifndef SHADER_H #define SHADER_H #include & ...