多线程练习之数字加减

2023-11-17

数字加减

题目:设计 4 个线程对象,两个线程执行减操作,两个线程执行加操作,使其返回结果为0 1 0 1…或为0 -1 0 -1…:

public class ThreadTest {
    public static void main(String[] args) {
        System.out.println("开始了");
        Number number = new Number();
        AddThread addThread = new AddThread(number);
        SubThread subThread = new SubThread(number);
        new Thread(addThread, "加线程1").start();
        new Thread(addThread, "加线程2").start();
        new Thread(subThread, "减线程1").start();
        new Thread(subThread, "减线程2").start();
    }
}

class AddThread implements Runnable {
    private Number num;

    public AddThread(Number num) {
        this.num = num;
    }

    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            try {
                this.num.setAdd();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

class SubThread implements Runnable {
    private Number num;

    public SubThread(Number num) {
        this.num = num;
    }

    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            try {
                this.num.setSubtract();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

    }
}

class Number {
    private int num = 0;
    private boolean flag = true;// true 可以加 false可以减

    public synchronized void setAdd() throws InterruptedException {
        while (!this.flag) // 这里不能使用if判断
            this.wait();
        Thread.sleep(100);
        this.num++;
        System.out.println(Thread.currentThread().getName() + "加操作,----num: " + num);
        this.flag = false;
        this.notifyAll();
    }

    public synchronized void setSubtract() throws InterruptedException {
        while (this.flag) // 这里不能使用if判断
            this.wait();
        Thread.sleep(200);
        this.num--;
        System.out.println(Thread.currentThread().getName() + "减操作,减:----num: " + num);
        this.flag = true;
        this.notifyAll();
    }
}

这里有一个坑,在阿里培训中有一个问题,如果在Number类中增加或者减数时使用if判断,这样如果是2个线程以上的话就会出现synchronized锁不生效的问题

因为当一个线程在进行减操作时,有两个线程依次进入加方法中,当第一个wait()第二个线程就可以进入,继续wait(),当减操作结束后,notifyAll所有线程,就会出现两个加操作的线程继续往下走,导致加二,减一的情况。

使用while函数会重新判断是否满足条件,不满足继续阻塞,就可以解决此问题

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

多线程练习之数字加减 的相关文章

  • 如何使用固定数量的工作线程实现简单线程

    我正在寻找最简单 最直接的方法来实现以下内容 主程序实例化worker 执行任务的线程 Only n任务可以同时运行 When n已达到 不再有工人 开始直到计数 正在运行的线程回落到下方n 我觉得Executors newFixedThr
  • 将一种类型的对象声明为另一种类型的实例有什么好处? [复制]

    这个问题在这里已经有答案了 可能的重复 Base b2 new Child 是什么意思 表示 https stackoverflow com questions 4447924 what does base b2 new child sig
  • 如何提取文件 jre-9/lib/modules?

    In JRE 9 lib目录 至少在 Windows 上 有一个名为modules其大小约为107 MB 是否可以提取该文件或在其中列出 java 模块 我可以看到一个名为jmod可以在jdk 9 bin jmod exe 但那是为了阅读
  • 在 Java 中从 SOAPMessage 获取原始 XML

    我已经在 J AX WS 中设置了 SOAP WebServiceProvider 但我无法弄清楚如何从 SOAPMessage 或任何 Node 对象获取原始 XML 下面是我现在获得的代码示例 以及我试图获取 XML 的位置 WebSe
  • 具有 CRUD 功能的基于 Spring Web 的管理工具

    在 PHP Symfony 世界里有一个工具叫 Sonata Adminhttps sonata project org https sonata project org 基于 AdminLTE 模板 这是一款一体化管理工具 具有登录 菜单
  • 使用 JSch 分别为各个提示提供输入

    问题是 SSH 连接需要在常规登录后提供另一个用户 ID 和密码信息 我正在使用 JSch 连接到远程服务器 它接受以下形式的输入InputStream 和这个InputStream只能通过一次 由于会话是交互式的 这会导致问题 我尝试将输
  • java中的单链表和双向链表?

    在java中 哪个集合接口可以有效地实现单链表和双向链表 请问代码示例吗 毫不奇怪 实现双向链表的正确接口是 LinkedList 看Java文档 http docs oracle com javase 8 docs api java ut
  • OpenNLP 与斯坦福 CoreNLP

    我一直在对这两个包进行一些比较 但不确定该往哪个方向走 我简单地寻找的是 命名实体识别 人 地点 组织等 性别识别 一个不错的训练 API 据我所知 OpenNLP 和斯坦福 CoreNLP 提供了非常相似的功能 然而 Stanford C
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • 正则表达式在 Velocity 模板中不起作用

    我在 Test java 中尝试过这个 String regex lt s br s s gt String test1 lt br gt System out println test replaceAll regex 但是当我在速度模板
  • Java - JPanel 内有边距和 JTextArea

    我想创建这样的东西 主面板有其边距 x 并且 TextArea 位于该面板的中心 几乎填满了面板 底部是另一个具有自定义尺寸 高度 y 的面板 可以使用某些快捷方式将其切换为可见和不可见 底部面板有 FlowLayout 和几个元素 问题是
  • java.lang.Object的hashCode具体使用的算法是什么

    中使用的算法是什么JVM实施java lang Object的隐含的hashCode 方法 OpenJDK or Oracle JDK答案中首选 它依赖于实现 并且在很大程度上 该算法是entirely取决于实施 只要它是一致的 但是 根据
  • 多线程——更快的方法?

    我有一堂有吸气剂的课程getInt 和一个二传手setInt 在某个领域 比如说领域 Integer Int 一个类的一个对象 比如说SomeClass The setInt 这里是同步的 getInt isn t 我正在更新的值Int来自
  • JAXB 编组器无参数默认构造函数

    我想从 java 库中编组一个 java 对象 当使用 JAXB marschaller 编组 java 对象时 我遇到了一个问题 A 类没有无参数默认构造函数 我使用Java Decompiler来检查类的实现 它是这样的 public
  • 如何检查日期字符串的有效性?

    在我的项目中 我需要检查日期字符串是否计算为正确的日期对象 我决定允许 yyyy MM dd 和日期格式 年 月 日 和 年 月 日 小时 分钟 我如何检查它们是否有效 我的代码为 1980 01 01 和一些奇怪的日期 如 3837 05
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • CXF:通过 SOAP 发送对象时如何排除某些属性?

    我使用 Apache CXF 2 4 2 当我将数据库中的某个对象返回给用户时 我想排除一些属性 例如密码 我怎样才能做到这一点无需创建临时的班级 有这方面的注释吗 根据 tomasz nurkiewicz 评论我应该使用 XmlTrans
  • 使用自定义比较器在 Java 中创建 SortedMap

    我想创建一个TreeMap在 Java 中具有自定义排序顺序 排序后的键是字符串 需要根据第二个字符进行排序 这些值也是字符串 示例地图 Za FOO Ab Bar 您可以像这样使用自定义比较器 Comparator
  • Jackson 反序列化相当于 @JsonUnwrapped 吗?

    假设我有以下课程 public class Parent public int age JsonUnwrapped public Name name 生成 JSON age 18 first Joey last Sixpack 我如何将其反
  • Android Google 地图无法在当前主题中找到样式“mapViewStyle”

    添加谷歌地图视图时 我扩展了MapView 使用xml编辑器将其添加到活动中 并将我的谷歌地图api密钥手动添加到布局xml文件中 我的权限在清单文件中允许互联网 我想知道的是 在 xml 编辑器中 我收到错误 无法在当前主题中找到样式 m

随机推荐

  • java21天打卡Day13-正则表达式

    原来正则表达式是这样用的
  • 前端实现文件在线预览

    需求 一个览pdf word xls ppt等文件需要在线预览功能 介绍 使用 XDOC文档预览云服务文档地址 基于HTTP的REST方式调用 只需要传入URL 支持pdf docx xlsx pptx rtf jpg png mp4等多种
  • DINO-DETR论文学习记录

    摘要 我们介绍了DINO 带有改进的去噪器box的DETR 一种最先进的端到端对象检测器 DINO 通过使用对比方式进行去噪训练 混合查询选择方法进行锚点初始化以及用于框预测的ook forward twice方案 在性能和效率方面比以前的
  • 使用WIFI模块AT指令进行HTTP交互

    超文本传输协议 HTTP HyperText Transfer Protocol 是互联网上应用最为广泛的一种网络协议 所有的WWW文件都必须遵守这个标准 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法 用户通过M0M1系
  • linux cd命令怎么用

    在Linux中 cd命令是用来改变当前工作目录的 具体使用方法如下 打开终端 输入cd命令 后面跟上要进入的目录的路径 例如 如果要进入home目录 可以输入cd home 按下回车键即可进入指定目录 如果要返回上一级目录 可以使用 cd
  • Arudio项目实战——003 TracKingTheCar(循迹小车)

    Arudio项目实战 003 TracKingTheCar 循迹小车 Cblock源码 Cblock转Arduino源代码 include
  • 信息学奥赛一本通C++语言——1111:不高兴的津津

    题目描述 津津上初中了 妈妈认为津津应该更加用功学习 所以津津除了上学之外 还要参加妈妈为她报名的各科复习班 另外每周妈妈还会送她去学习朗诵 舞蹈和钢琴 但是津津如果一天上课超过八个小时就会不高兴 而且上得越久就会越不高兴 假设津津不会因为
  • echart常用图表配置

    echart常用图表配置 柱状图 3D柱状图 效果 代码 排行榜柱状图 效果 代码 排行榜反转柱状图 效果 代码 柱状图 3D柱状图 效果 代码 import graphic from echarts const VALUE Array f
  • STM32滴答定时器与UCOS时钟系统,以及心跳和延时函数的实现.

    Systick就是一个定时器而已 只是它放在了NVIC中 主要的目的是为了给操作系统提供一个硬件上的中断 号称滴答中断 滴答中断 这里来简单地解释一下 操作系统进行运转的时候 也会有 心跳 它会根据 心跳 的节拍来工作 把整个时间段分成很多
  • 牛客-中等及基础难度python

    5进制转换 写出一个程序 接受一个十六进制的数 输出该数值的十进制表示 coding utf 8 def main nums 16进制对照字典 num dict 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9
  • AntV可视化图表G2-柱状图

    文章目录 前言 快速上手 特性 安装 浏览器引入 npm 安装 开始使用 浏览器引入方式 1 创建 div 图表容器 2 编写图表绘制代码 完整代码 在线代码 前言 G2 是一套基于可视化编码的图形语法 以数据驱动 具有高度的易用性和扩展性
  • 《Real-Time Rendering 3rd》提炼总结 RTR3读书笔记

    Real Time Rendering 3rd 提炼总结 毛星云 https zhuanlan zhihu com p 34207965 2 5 几何着色器 The Geometry Shader 几何着色器可以改变新传递进来的图元的拓扑结
  • npm 查看安装了哪些包的相关指令

    npm 查看安装了哪些包 指令1 npm list depth 0 depth 表示深度 我们使用的模块会有依赖 深度为零的时候 不会显示依赖模块 这个指令可以用来 显示 出我们的项目中安装了哪些模块 其实就是 package json 文
  • Linux网络服务:部署YUM仓库与NFS服务

    目录 一 理论 1 部署YUM仓库服务 2 NFS共享存储服务 二 实验 1 通过httpd服务建立yum仓库 2 通过vsftpd服务建立yum仓库 3 搭建NFS实现2台或3台服务器共享一个目录 一 理论 1 部署YUM仓库服务 1 Y
  • JdbcTemplate使用in条件查询sql

    在使用条件in的sql的时候 使用NamedParameterJdbcTemplat public Object getXXX String roleAuth long roleId NamedParameterJdbcTemplate n
  • Python基础(if条件判断)

    if条件判断的第一种情形 纯if if语句的语法规则 if 条件 代码 意思是如果条件成立就执行该代码 如果不成立 就不执行 money 100 if money gt 50 print 吃饭 print 回家 此处输出 吃饭 回家 若mo
  • SQLi LABS Less-4 联合注入+报错注入

    第四关是双引号 括号的字符型注入 推荐使用联合注入 报错注入 方式一 联合注入 参考文章 联合注入使用详解 原理 步骤 实战教程 第一步 判断注入类型 地址栏输入 id 1 and 1 a 页面正常显示 地址栏输入 id 1 and 0 a
  • OceanBase-一款功能无敌的多模数据库

    点击上方 小强的进阶之路 选择 星标 公众号 优质文章 及时送达 预计阅读时间 5分钟 NoSQL历史 KV型NoSql 代表 Redis 解决快速的读写问题 但是会丢失数据 搜索型NoSql 代表 ElasticSearch 支持快速的全
  • 拷贝构造函数和赋值构造函数声明为私有的作用

    转贴地址 http blog csdn net winer632 archive 2009 01 12 3762292 aspx 每个类只有一个赋值函数 由于并非所有的对象都会使用拷贝构造函数和赋值函数 程序员可能对这两个函数有些轻视 请先
  • 多线程练习之数字加减

    数字加减 题目 设计 4 个线程对象 两个线程执行减操作 两个线程执行加操作 使其返回结果为0 1 0 1 或为0 1 0 1 public class ThreadTest public static void main String a