参考 - P507

1. 说明

  1. 两个线程共享同一份数据,每次使用数据时,需要先判断其是否在合理范围
  2. 每次使用数据完毕使用Thread.sleep函数让线程阻塞

2.代码

class BankAccount {private int balance = 100;public int getBalance() {return balance;}public void withdraw(int amount) {balance = balance - amount;}
}public class RyanAndMonicaJob implements Runnable {private BankAccount account = new BankAccount();public static void main (String[] args) {RyanAndMonicaJob theJob = new RyanAndMonicaJob();Thread one = new Thread(theJob);Thread two = new Thread(theJob);one.setName("Ryan");two.setName("Monica");one.start();two.start();}public void run() {for (int x = 0; x < 10; x++) {makeWithdrawal(10);if(account.getBalance() < 0) {System.out.println("Overdrawn!");}}}private void makeWithdrawal(int amount) {String currentThread = Thread.currentThread().getName();if(account.getBalance() >= amount) {System.out.println(currentThread + "is about to withdraw");try{System.out.println(currentThread + " is going to sleep");Thread.sleep(500);} catch(InterruptedException ex) {ex.printStackTrace();}System.out.println(currentThread + " woke up.");account.withdraw(amount);System.out.println(currentThread + " completes the withdrawl");} else {System.out.println("Sorry, not enough for " + currentThread);}}
}
```![在这里插入图片描述](https://img-blog.csdnimg.cn/20201113004828229.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BpYW5vOTQyNQ==,size_16,color_FFFFFF,t_70#pic_center)

[Head First Java] - 线程共享数据问题相关推荐

  1. java 多线程共享数据_Java多线程学习:多个线程间共享数据

    多个线程访问共享对象和数据的方式有两种情况: 1.每个线程执行的代码相同,例如,卖票:多个窗口同时卖这100张票,这100张票需要多个线程共享. 2.每个线程执行的代码不同,例如:设计四个线程,其中两 ...

  2. java 多线程 共享数据_JAVA多线程提高四:多个线程之间共享数据的方式

    多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...

  3. C++11 多线程线程共享数据

    共享数据的问题 这些在操作系统中都有详细的介绍,可以回顾操作系统课程..很典型的就是数据竞争问题. 互斥量保护数据 最原始的方式:使用std::mutex创建互斥量,使用成员lock()加锁,使用成员 ...

  4. java 多个线程共享数据_【java并发】多个线程间共享数据

    先看1个多线程间同享数据的问题: 设计4个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显触及到了线程间通数据的同享,4个线程同享1个data,共同操作1 ...

  5. 并发编程02-什么是线程安全以及Java虚拟机中哪些数据是线程共享的,那些是线程私有的

    线程安全的本质 什么是线程安全 要说什么是线程安全,那么我们看看生活中例子吧. 场景1:王菲要来西安体育场开演唱会,这个体育场规模不是很大,能容纳1000个人,于是准备了1000张票,后天中午12点在 ...

  6. 写java线程导致电脑内存不足_如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码...

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  7. java线程基础_Java多线程基础

    前言 在我们工作和学习的过程中,Java线程我们或多或少的都会用到,但是在使用的过程上并不是很顺利,会遇到各种各样的坑,这里我通过讲解Thread类中的核心方法,以求重点掌握以下关键技术点: 线程的启 ...

  8. java线程怎么用_Java多线程基本使用

    一.概念 1.进程 1.1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 1.2线程:就是进程中一个独立的控制单元,线程在控制着进程的执行,一 ...

  9. java线程 锁_Java多线程(二) 多线程的锁机制

    当两条线程同时访问一个类的时候,可能会带来一些问题.并发线程重入可能会带来内存泄漏.程序不可控等等.不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题.本篇总结主要著名 ...

最新文章

  1. ASP.NET重用代码技术 - 用户控件技术
  2. reindex-maven 私服(nexus)架设以及项目管理中遇到的问题及解决方案(updating)
  3. 的主机名_Mac教程——修改mac 下主机名、电脑名、局域网主机名
  4. 百度java验证码不显示不出来,Java-使用百度链接时,遇到无法弹出用户登录框的问题...
  5. 有逼格的产品经理都用什么样的杯子?
  6. hadoop 2.6 伪分布式的安装
  7. idea 设置默认 jdk
  8. html画圣诞树—动态效果展示【炫酷合集 免费获取源码】
  9. 计算机网络传媒介,2.3 网络传输媒介 - 第2章 计算机网络硬件基础 - 《计算机网络技术与应用》 - 倾心驿站 - 恰教程网...
  10. Centos7 firewall防火墙常用配置
  11. 《Fortran 95 程序设计》阅读笔记三
  12. python编码无法使用turtle库_使用Turtle库教Python
  13. 代码检查技术Checkstyle与p3c调研
  14. laravel 发送邮件
  15. 【Git学习】解决GitLab内存消耗大的问题
  16. 【Lilishop商城】No2-1.确定项目结构和数据结构(用户、商品、订单、促销等模块)
  17. QPushButton按钮互斥效果
  18. 在Matlab图片里输入数学公式、符号和希腊字母的方法
  19. 用Go语言编程的利与弊
  20. 黄浩老师cpp平时作业(十一)矩阵乘法矩形类读写文件与结构体

热门文章

  1. php导出照片,Laravel使用 Laravel Excel文件导出图片功能
  2. lan8720a自协商启动_紫金矿业2020届校招海外9站全面启动(面向全专业)
  3. applicationproperties不是小叶子_三角梅整株叶子发黄从这里找原因,早解决早生长!...
  4. 强化学习——Qlearning
  5. Python函数之 ceil, floor,round
  6. 深度学习笔记(待续)
  7. 对flex深入研究一点
  8. 项目开发中的自我总结
  9. Ansible基础概述
  10. android是32-bit系统还是64-bit系统