java 多线程 并发实例_java编程多线程并发处理实例解析

2023-10-27

本文主要是通过一个银行用户取钱的实例,演示java编程多线程并发处理场景,具体如下。

从一个例子入手:实现一个银行账户取钱场景的实例代码。

第一个类:Account.java

账户类:

package cn.edu.byr.test;

public class Account {

private String accountNo;

private double balance;

public Account(){

}

public Account(String accountNo,double balance){

this.accountNo = accountNo;

this.balance = balance;

}

public int hashcode(){

return accountNo.hashCode();

}

public String getAccountNo(){

return this.accountNo;

}

public double getBalance(){

return this.balance;

}

public void setBalance(double balance){

this.balance = balance;

}

public Boolean equals(Object obj){

if(this == obj)

return true;

if(obj != null && obj.getClass() == Account.class){

Account target = (Account)obj;

return target.getAccountNo().equals(accountNo);

}

return false;

}

}

第二个类:DrawThread.java

取钱线程类:

package cn.edu.byr.test;

public class DrawThread extends Thread {

private Account account;

private double drawAmount;

public DrawThread(String name,Account account,double drawAmount){

super(name);

this.account = account;

this.drawAmount = drawAmount;

}

public void run(){

// synchronized (account) {

if(account.getBalance() > drawAmount){

System.out.println(getName() + "取钱成功,吐出钞票:" + drawAmount);

// try{

// Thread.sleep(1);

// }

// catch(InterruptedException e){

// e.printStackTrace();

// }

account.setBalance(account.getBalance() - drawAmount);

System.out.println("\t 余额为 : " + account.getBalance());

} else

System.out.println(getName() + "取钱失败,余额不足!");

// }

}

public static void main(String[] args){

Account acct = new Account("123456",1000);

new DrawThread("A",acct,800).start();

new DrawThread("B",acct,800).start();

}

}

上面代码中注释掉的部分:(1)synchronized同步代码块 (2)线程休眠。如果注释掉(1)、(2),则运行结果有多种可能性,可能性之一(概率较小),符合正常逻辑:

B取钱成功,吐出钞票:800.0

余额为 : 200.0

A取钱失败,余额不足!

应该是B先强找到取钱资源,并且正确修改余额后,A才开始判断用户余额;这种概率非常小,多数运行会类似以下情况:

A取钱成功,吐出钞票:800.0

B取钱成功,吐出钞票:800.0

余额为 : -600.0

余额为 : 200.0

这明显是不符合逻辑的,从运行结果可以猜测,A先抢占资源,取出金额,但在修改余额之前,资源被B抢占;由于余额未被修改,则B看到余额仍然是800,B仍然取出金额;A先运行修改余额,但并未打印,B抢夺资源;B修改余额,并打印余额,为-600;A打印余额,为200;

如果加上(2)线程休眠,则一定是错误状况,因为A或B在取出金额后一定会因为sleep释放CPU资源,JVM会调用其他处于准备状态的进程。第二个取钱判断余额一定是错误的。

如果加上(1)synchronized同步代码块,在线程run方法体中对account进行加锁;则每次都会保证执行逻辑正常:

A取钱成功,吐出钞票:800.0

余额为 : 200.0

B取钱失败,余额不足!

可以设想一下执行过程:

A先抢占资源,在run方法体初始对account类进行加锁;然后开始执行同步代码块;如果执行到中间某个环节,CPU资源被B抢占;B开始执行,一开始也会对account类进行加锁。但是加锁时会发现account已经被A占用,则会调整为阻塞状态等待A释放资源;A执行完同步代码块后释放account的锁,B继续执行;B运行时看到的余额保证是A已经修改过的,会按照正确逻辑正常执行。

总结

以上就是本文关于java编程多线程并发处理实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 多线程 并发实例_java编程多线程并发处理实例解析 的相关文章

  • (JS设计模式)二.部分面试题

    1 打车时 可以打专车或者快车 任何车都有车牌号和名称 不同车价格不同 快车每公里1元 专车每公里2元 行程开始时 显示车辆信息 行程结束时 显示打车金额 假定行程就5公里 题目 画出UML类图 用ES6语法写出该示例 答 UML类图 2
  • Linux命令·touch

    linux的touch命令不常用 一般在使用make的时候可能会用到 用来修改文件时间戳 或者新建一个不存在的文件 1 命令格式 touch 选项 文件 2 命令参数 a 或 time atime或 time access或 time us
  • Office2021版64位+mathtype6.9

    终于安装成功了 如果你也遇到以下问题 试试看我的方法行不行 终于成功了很激动 在这里插入代码片 按照网上的教程 分别在以下两个文件夹 注意不一样的根目录 放了这三个文件 然后 打开office是这样的 接着 按照网上说的 不成功就把这三个文
  • uniApp 开发支付宝小程序引入订阅消息组件

    1 manifest json 配置 2 page json 配置 3 页面引入组件
  • EXTJS--分页PagingToolbar插件的重新刷新、重新加载方法

    var pagebar new Ext PagingToolbar store store pageSize Ext page pageSize displayInfo true displayMsg 共有 2 条记录 当前显示 0 1 条
  • 详解区块链分层构架

    区块链 是一个结合了数学 密码学 计算机学等大量学科和技术而形成的去中心化网络系统 如何实现这些技术的融合 则来自于区块链在构建时所形成的六大主要的分层结构 他们分别是网络层 数据层 共识层 激励层 合约层 以及应用层 此外 还有支持数据流
  • 快速入门 YOLOv5(ultralytics)

    YOLOv5 是一系列在 COCO 数据集上预训练的对象检测架构和模型 代表Ultralytics 对未来视觉 AI 方法的开源研究 结合了在数千小时的研究和开发中获得的经验教训和最佳实践 文档 有关训练 测试和部署的完整文档 请参阅YOL
  • windows应急响应工具

    Webshell查杀 d盾 http www d99net net WEBDIR WebShell 扫描服务 OpenRASP 团队 https scanner baidu com pages intro 河马 https www shel
  • Telegram 查看下载保存的文件

    文章目录 Android 缓存文件 本地文件 Windows 缓存文件 本地文件 清理缓存 Android Windows Android 缓存文件 单纯的点下载或者图片 GIF 等的预览只会缓存到 Internal Storage sdc
  • [问题已处理]-mac安装cobra失败

    导语 今天在mac环境中没法成功安装cobra 记录一下避免以后踩坑 执行go get报错 更换安装方式 安装cobra cli go get u github com spf13 cobra latest go install githu
  • 最全最实用的 安装ESXi6及Linux虚拟机的创建教程

    ESXi的作为虚拟化环境的虚拟机管理程序层 负责将服务器虚拟成资源池 提供接口供管理组件调用 将下面的ISO刻录成光盘或可启动 盘 安装在服务器裸机上 安装过程 开机做好阵列 选择从安装介质启动 按F11继续 输入密码 rootroot 密
  • [QT编程系列-8]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自定义对话框

    目录 3 QT窗体设计 3 6 自定义对话框 3 6 1 种类 3 6 2 输入对话框 编辑 3 6 3 字体对话框 3 6 4 文件对话框 编辑 3 6 5 颜色对话框 3 6 6 输出对话框 编辑 3 6 7 进度条对话框 编辑 3 6
  • linux下编译内核时出现 scripts/basic/fixdep.c:206 等错误解决办法

    现象如下 下面是网上抄的 我本人是英文的 不方便看 就当下面是翻译的吧 大致信息如下 scripts basic fixdep c 300 警告 未使用的变量 s scripts basic fixdep c 在函数 print deps
  • AlarmManager实现定时功能

    实现定时间隔功能 1 发送 AlarmManager alarmService AlarmManager context getSystemService ALARM SERVICE Intent alarmIntent new Inten
  • js中[]、{}、()区别

    一 大括号 表示定义一个对象 大部分情况下要有成对的属性和值 或是函数体 表示对象 表示对象的属性 方法 如果用在方法名后面 代表调用 如 var LangShen Name Langshen AGE 28 上面声明了一个名为 LangSh
  • 状态机总结(简洁)

    一 概念 状态机简写为 FSM Finite State Machine 也称为同步有限状态机 我们一般简称为状态机 之所以说 同步 是因为状态机中所有的状态跳转都是在时钟的作用下进行的 而 有限 则是说状态的个数是有限的 状态机的每一个状
  • PCL1.12+VTK9.1+QT6编译部署

    本文讲解使用的环境是vs2019 pcl1 12 0 vtk9 1 qt6 0 最后再展示一个示例程序 1 编译VTK vtk下载地址如下 https vtk org download 然后用cmake构建 修改一下几个地方 然后打开生成的
  • 【解决】CentOS_7 usb安装盘制作,修改安装目录后依然dracut-initqueue timeout

    1 正常流程进centos install 报错dracut initqueue timeout 2 进入dracut时 cd dev ls grep sdb 没有文件 3 拔插U盘后 ls grep sdb 显示 sdb4 sdb 4 重
  • 教妹学Java(十三):if-else 语句详解

    大家好 我是沉默王二 一个和黄家驹一样身高 和刘德华一样颜值的程序员 本篇文章通过我和三妹对话的形式来谈一谈 if else 语句 教妹学 Java 没见过这么有趣的标题吧 语不惊人死不休 没错 本篇文章的标题就是这么酷炫 接受不了的同学就

随机推荐

  • ETL工具

    这些年 几乎都与ETL打交道 接触过多种ETL工具 现将这些工具做个整理 与大家分享 一 ETL工具 国外 1 datastage 点评 最专业的ETL工具 价格不菲 使用难度一般 下载地址 ftp ftp seu edu cn Pub D
  • 一步一步写STL:空间配置器 (1)

    侯捷说 追踪一流程序 并从中吸取养分 模仿着他写的程序 比那些自以为靠自己努力写出来的下三流程序价值高得多 至少我这么认为 世界上99 999 的程序 在STL面前都是下三流水平 侯捷老师这句话对STL的评价太高了 以前只是熟练使用STL
  • Tensorflow运行机制

    TensorFlow是一种基于数据流图的编程框架 它使用数据流图来描述计算过程 其中节点表示操作 边表示数据流 从而实现了高效的分布式计算和自动求导 在TensorFlow中 计算过程分为两个阶段 构建阶段和执行阶段 在构建阶段 我们使用T
  • 达梦数据库-分区表维护

    分区表的维护主要有增加分区 删除分区 交换分区 合并分区 拆分分区 1 增加分区 添加一个新的分区 2 删除分区 删除一个就分区 3 交换分区 将分区数据跟普通表交换 2张表结构必须一样 4 合并分区 将临近的两个分区合并为一个分区 目前仅
  • 绘图中的渐变

    绘图渐变 指的就是在指定区域内 指定开始位置到指定结束为止 一种颜色颜色逐渐变成另一种颜色的图 qt中的渐变分为三个类别 1线性类别 QLinearGradient 2 角度渐变 QConicalGradient 3 辐射渐变 QRadia
  • Android Studio 给方法添加注释自动生成参数的快捷设置

    没有废话 直接上图 Android Studio gt File gt Setting gt Keymap gt 发现框输入comment gt 选择Other的Fix doc comment 2 选择 Add keyboard short
  • Videos from Embedded Linux Conference 2014

    本文转载至 http free electrons com blog elc2014 videos As the summer is coming to an end we finally managed to publish the vi
  • Kubernetes详解(二十)——ReplicaSet控制器

    今天继续给大家介绍Linux运维相关知识 本文主要内容是ReplicaSet控制器 一 ReplicaSet控制器概述 ReplicaSet控制器是Pod类控制器的一种实现 该控制器用于确保其管控的Pod对象副本数量在任意时刻都能够满足用户
  • XXE-lab(全踩坑)实录

    在bWAPP中有一关是XML External Entity Attacks XXE 传送门 比较简单的了解了一下XXE 师傅的博客 浅谈XML实体注入漏洞 XXE漏洞全称XML External Entity Injection即xml外
  • 解决Windows系统下VNC Viewer无法连接到远程主机上的VNC Server的问题

    问题如下 笔记本 IP 10 100 172 194 上装了VNC Viewer 台机 IP 10 100 100 103 上装了VNC Server 原本笔记本连接无线网 可以通过VNC远程连接到办公网的台机的桌面 自从台机重装了系统后
  • 去掉suse里ls默认显示隐藏文件的特性

    以root权限suse终端时 执行ls命令 隐藏文件 文件名以 开头 也都显示出来了 这一点 我是不太喜欢 既然是隐藏文件 一般情况下就不要出现 尤其是 root目录 一堆隐藏文件 很影响我查找文件 要去掉这个特性 先执行alias命令 一
  • arxiv文章下载很慢怎么办?

    对于我们这样的深度学习屌丝来说 没钱 没资源 没数据 没时间 只能看看别人的论文生存了 经常会到arxiv上下载一些文章 比如cvpr的文章 但是 由于国内封锁 下载很慢 甚至接连几天打不开arxiv的网站 咋办 强烈推荐使用中科院arxi
  • usb描述符以及传输方式

    lsusb命令 Bus 002 表示第2个usb主控制器 Device 002 表示系统给usb鼠标分配的设备号 ID 8087 8002 Intel Corp 表示usb设备的ID 这个ID由芯片制造商设置 可以唯一表示该设备 8087
  • 洛谷P5731 【深基5.习6】蛇形方阵

    include
  • 电脑itunes,iTunes

    Music TV and podcasts take center stage iTunes forever changed the way people experienced music movies TV shows and podc
  • 内存管理之分段与分页

    内存管理之分段与分页 转载自多名技术分享者 仅供参考 第一篇 要理解分段和分页 那么得理解为什么会出现分段和分页的技术 首先 这两个技术都是为了利用和管理好计算机的资源 内存 在分段这个技术还没有出现之前 程序运行是需要从内存中分配出足够多
  • 【Verilog】Verilog定义二维数组(2D Array)

    目录 定义的种类 第一种 赋值方法 第二种 赋值方法 第三种 赋值方法 定义的种类 首先看几组定义类型 第一种 定义一个位宽为8的 data1 reg 和 data2 wire 的变量 reg 7 0 data1 wire 7 0 data
  • java.io.IOException: InvalidResourceRequestException: Invalid resource request

    1 背景 做一次kylin计算选择mr进行计算cube 但是报错 首先是 这一报错 报错打开是 yarn上的原因为 2019 05 09 15 07 38 495 ERROR Thread 52 org apache hadoop mapr
  • R文本挖掘之五情感分析

    本文是转载 原文地址 CSDN R语言做文本挖掘 Part5情感分析 Part5情感分析 这是这个系列里面最后一篇文章了 其实这里文本挖掘每一个部分单拎出来都是值得深究和仔细研究的 我还处于初级研究阶段 用R里面现成的算法 来实现自己的需求
  • java 多线程 并发实例_java编程多线程并发处理实例解析

    本文主要是通过一个银行用户取钱的实例 演示java编程多线程并发处理场景 具体如下 从一个例子入手 实现一个银行账户取钱场景的实例代码 第一个类 Account java 账户类 package cn edu byr test public