多线程环境下的增量和减量

2024-02-11

我正在尝试在多线程环境中 int 变量的经典增量/减量。这是我的示例代码。

public class SyncIncDec {


    public static void main(String[] args) {

        SyncCounter count = new SyncCounter();

        Thread incThread = new Thread(() -> {
            count.increment();
        });

        Thread decThread = new Thread(() -> {
            count.decrement();
        });

        Thread displayThread = new Thread(() -> {
            System.out.println("Count value : " + count.getX());
        });

        incThread.start();
        decThread.start();
        displayThread.start();      

        try {
            incThread.join();
        } catch (InterruptedException e) {
//          e.printStackTrace();
        }

        try {
            decThread.join();
        } catch (InterruptedException e) {
//          e.printStackTrace();
        }

        try {
            displayThread.join();
        } catch (InterruptedException e) {
//          e.printStackTrace();
        }

    }

}


class SyncCounter {

    private int x=0;

    public SyncCounter() {
        super();
    }

    public SyncCounter(int y) {
        super();
        x = y ;
    }

    synchronized int  getX() {
        return x; 
    }

    void setX(int y) {
        x = y ;
    }

    void increment() {
        ++x;
    }


    void decrement() {
        --x;
    }

}

尽管我对所有三个线程都使用了 join() 方法,但我仍然得到不一致的结果。 这里的 join 不是意味着主线程要等待每个线程完成执行吗?我什至尝试将同步添加到三个方法签名中的每一个中;但我得到的结果不一致。

除了使用变量的原子版本之外,我还能如何确保始终得到 0?


你调用join()仅在所有线程启动后才在三个线程上。所以你不能保证所引用的线程displayThread变量在递增和递减计数器的线程之后运行。
为了确保这一点,请调用join()在您启动这些线程后:

incThread.start();
decThread.start();
incThread.join();
decThread.join();
displayThread.start(); 

它将阻塞当前线程,直到执行递增和递减,无论顺序如何join()后被调用start()调用这些线程。

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

多线程环境下的增量和减量 的相关文章

  • 数组查找时间复杂度和。它是如何存储的

    众所周知 通过索引访问数组的时间复杂度是O 1 Java 的文档ArrayList 它由数组支持 对其也有同样的说法get手术 size isEmpty get set iterator 和 listIterator 操作以恒定时间运行 查
  • 在 Java 中重置 Graphics2D 对象

    我正在用 Java 尝试 Graphics2D 但像往常一样 我被困住了 P 问题是 假设我有这个代码 Graphics2D g Graphics2D this getGraphics Inside a JFrame g rotate Ma
  • 面试问题 - 在排序数组 X 中搜索索引 i,使得 X[i] = i

    昨天面试时 我被问到了以下问题 考虑一个 Java 或 C 数组X它已排序并且其中没有两个元素是相同的 如何最好地找到索引i这样该索引处的元素也是i 那是X i i 作为澄清 她还给了我一个例子 Array X 3 1 0 3 5 7 in
  • 定制法国号码格式

    我尝试为美国国家 地区使用自定义数字格式 到目前为止效果很好 Not something I want NumberFormat numberFormat0 NumberFormat getNumberInstance Locale US
  • java中如何围绕另一个移动对象旋转一个对象?

    我对 Java 很陌生 想要编写一个简单的太阳系统 其中月球绕地球旋转 地球绕太阳旋转 一切正常 除了月亮不想正确移动 由于地球偏离月球的初始位置 月球的自转半径会根据该距离而增大 同样 当地球接近月球惯性位置时 自转半径会减小 如果初始位
  • 如何通过keytool命令删除已经导入的证书/别名?

    我正在尝试通过 keytool 命令删除已导入的证书 keytool delete noprompt alias initcert keystore keycloak jks 但低于异常 keytool 错误 java lang Excep
  • Spring Batch:比较数据库之间的数据

    我有两个数据库 Oracle 和 MySQL 目标是将Oracle表中的值保存到MySQL中 要求 MySQL表中不存在数据 但我在理解 Spring Batch 时遇到了困难 步骤中 它包含itemReader itemProcessor
  • 如何用java对jpg进行像素化?

    我正在尝试使用 Java 6 对 JPEG 进行像素化 但运气不佳 它需要使用 Java 而不是像 Photoshop 这样的图像处理程序 并且它需要看起来像老派 像这样 有谁能够帮助我 使用java awt image javadoc h
  • 让 Java 与 Windows 10 Ubuntu 一起使用

    我安装了 Windows 10 周年更新 以便可以在 Windows 上的 Ubuntu 上尝试 Bash 看如何安装 http www howtogeek com 249966 how to install and use the lin
  • 用java解密AES加密文件

    我有一个使用 AES 使用 java 应用程序加密的文件 我还有一个加密的密钥文件 但我不明白如何使用密钥来解密文件 大多数教程和示例都会在一个地方创建临时随机密钥 加密文件和解密 所以 问题是如何指定解密时必须使用的密钥 EDIT 我发现
  • JFreeChart MeterPlot

    我目前正在用java做Agent项目 在某些时候 我需要显示一个仪表 例如 电池电量 我的程序中有 5 个代理 每个代理都会创建自己的带有名称的仪表图 但不知何故他们没有更新数据集 或者他们正在更新数据集 只是它没有显示在仪表图上 任何想法
  • 在java中设置Process对象的安全性

    有人可以告诉我如何限制通过进程对象访问系统属性吗 如果我通过进程对象运行以下代码 我可以抛出安全异常吗 System getProperty user home 请告诉我如何为流程对象配置证券 在ProcessBuilder类文档中 环境方
  • 如何将我的自定义相机应用程序设置为默认应用程序?

    如果我使用以下代码 Intent takePictureIntent new Intent MediaStore ACTION IMAGE CAPTURE startActivityForResult takePictureIntent 1
  • 无法运行简单的 doclet 程序:包 com.sun.javadoc 不存在

    我正在尝试运行一个简单的 doclet 程序 但无法编译它 javac cp cygdrive c Progra 2 Java jdk1 8 0 65 lib tools jar A java 但它抛出 A java 1 错误 包 com
  • 何时以及为何使用缓冲输入和输出流? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我读到这些是为了减少磁盘 网络调用开销而使用的 这在写操作的情况下似乎很好 但是进行缓冲读取有什么好处呢 如果您按字节读取文件 则每次都会进
  • Google OR-Tools:无法运行 java 示例,java.lang.UnsatisfiedLinkError:java.library.path 中没有 jniortools

    我是java新手 我想尝试google or tools来解决车辆路由问题 只是尝试运行 java 示例here https developers google com optimization introduction run progr
  • SAXParseException:找不到元素“定义”的声明

    我对 camunda 和 DMN 完全陌生 我试图在 spring boot 中运行 DMN 示例 链接在这里 https github com camunda camunda bpm examples tree master dmn en
  • 当我必须在 Netty4 编码器中调用 ByteBuf.retain() 时?

    我正在编写一个以 NUL 终止 JSON 消息的编码器 以便在消息碎片的情况下可以对其进行解码 我找到了这个样本 gt click https github com netty netty blob master codec src mai
  • 如何在 SpringDoc OpenAPI 3 中引用文件?

    我有 Spring Boot 项目 我想在其中记录我的 API 这里是正在处理的 Web 服务的示例 ApiResponses value ApiResponse responseCode 200 content Content media
  • 文件构造函数说明

    我无法理解以下文件构造函数 public File String parent String child and public File File parent String child 参数有什么作用parent and child该文件

随机推荐

  • 检查可选数组是否为空

    在 Objective C 中 当我有一个数组时 NSArray array 我想检查它是否不为空 我总是这样做 if array count gt 0 NSLog There are objects else NSLog There ar
  • 如何在 DropDownList 控件中列出 Active Directory 中的所有用户

    我正在使用 Visual Studio 2005 C 我正在尝试检索 Active Directory 中的用户列表并将其插入到下拉列表控制 我可以知道如何提取用户以及如何将它们插入到下拉列表控制 EDIT 我希望完成许多功能部分 首先是列
  • bigQuery Google Cloud 如何与其他用户共享数据集?

    我使用我的 userA 帐户在 Google Cloud 中定义了一个 bigQuery 数据集 我希望属于同一组的同事 userB 能够查看我定义的数据集 使用bq命令行界面中 userB 可以看到项目 但看不到数据集 如何与用户B共享用
  • 如何获取表单内所有输入的ID?

    如何获取数组中表单内输入元素的所有 id ids myform input id map function return this id get
  • Angular:嵌入、设置SVG元素的颜色

    我有一个component html这超出了我的 svg 组件
  • TinyMCE gulp 配置

    我正在构建一个 Web 应用程序 我想使用 TinyMCE 我正在使用 gulp 和 browserify 我已经通过 npm 下载了 TinyMCE 并且在我的 app js 文件中需要它并运行gulp命令但我收到此错误Failed to
  • 数组无法解析?这是构建路径问题吗?

    当我打字时Arrays sort arr 在 Eclipse 中 我收到此错误Arrays cannot be resolved当我左键单击红色下划线时Arrays我不明白这个词import java util Arrays正如预期的那样
  • Spring AOP:仅建议使用上下文 Bean?

    我是 Spring AOP 的新手 我尝试使用方面进行日志记录 这是我的配置 方面 Aspect public class LoggerAspect Pointcut execution aop LoggerAspTest private
  • 如何在不安装条形码扫描仪应用程序的情况下使用ZXing库

    我一直在开发一个 Android 应用程序来扫描条形码和 QR 码并将结果发送到其他应用程序 HTTP 我已经通过互联网阅读了大部分文档 并在 stackoverflow 中阅读了它并使其正常工作 我可以在我的设备上运行独立的 zxing
  • 原则 2 多级继承

    我在多级继承方面遇到一些麻烦 ORM Entity ORM Table name et date ORM InheritanceType JOINED ORM DiscriminatorColumn name type type strin
  • Android 对话框 - 自定义背景而不是变暗或模糊

    我创建了自己的自定义对话框 它工作正常 但我想将变暗的背景更改为自定义图案 例如图像文件或 xml 形状 我怎样才能做到这一点 请注意 我不想改变调光强度 但我只想用一种模式替换这种调光 我找到了解决这个问题的方法 我从 vipul mit
  • 动态创建 Yii FormModel 对象 (CFormModel)

    我正在开发一个涉及在高抽象级别生成表单的应用程序 它是一个 CMS 应用程序 我想动态创建 CFormModel 对象并即时设置表单字段 我想我可以通过扩展 CFormModel 然后动态创建代表表单字段的类属性 Yii 行话中的 属性 来
  • 从 url 加载 Rdata 文件

    我在加载文件时遇到困难 因此它不会丢失其尺寸 所以这就是我现在所处的位置 gt mood data lt read table http www psychology mcmaster ca bennett psy710 datasets
  • 检查 android.graphics.path 与其自身的交集

    我想检查路径是否与自身相交 如果是 则碰撞在 x y 只是为了突出显示 我如何检查一条路径是否与另一条路径相交也非常有趣 这是一个屏幕截图 可以更好地解释我的意思 https i stack imgur com JrEmN png http
  • Visual Studio Cordova:打包 IOS 应用程序时,如何将配置文件添加到 XCode 的“构建设置”的代码签名部分?

    使用 Visual Studio Cordova 时 我按照以下说明将应用程序发布到 Apple App Store http taco visualstudio com en us docs tutorial package publis
  • iOS 连接数据库的正确架构?

    我是一名 Web 开发人员 正在着手创建移动 iOS Android 应用程序 因此 我想要了解的是应该如何构建移动应用程序来访问 发布 更新 删除 存储在中央服务器上的数据 出于说明目的 假设我正在创建一个移动食谱应用程序 名为 MyRe
  • 为 Selenium 创建 HTTP Basic auth Chrome 扩展(MWE 可用)

    我正在尝试使用 Google Chrome 运行 Selenium 测试 我希望使用 HTTP 基本身份验证登录 这在 Selenium 中没有实现 因此建议加载扩展 我正在使用来自的代码 https github com RobinDev
  • Linq to SQL 外键

    数据库表的 DDL Users id int identity name varchar unique PCs id int idnetity name varchar unique userid FK to Users Apps id i
  • 将哈希表转换为字符串数组

    如何将哈希表转换为字符串数组 假设 l table 是一个哈希表 如果我尝试 l array l table format table 那么 l array 是一个数组 但是一个 FormatEntryData 对象的数组 如果我做 str
  • 多线程环境下的增量和减量

    我正在尝试在多线程环境中 int 变量的经典增量 减量 这是我的示例代码 public class SyncIncDec public static void main String args SyncCounter count new S