竞争条件:整数的最小和最大范围

2023-12-26

我最近在一次采访中被问到这个问题。

给定以下代码,静态整数的最小和最大可能值是多少num?

import java.util.ArrayList;
import java.util.List;

public class ThreadTest {
    private static int num = 0;

    public static void foo() {
        for (int i = 0; i < 5; i++) {
            num++;
        }
    }

    public static void main(String[] args) throws Exception{
        List<Thread> threads = new ArrayList<Thread>();
        for (int i = 0; i < 5; i++) {
            Thread thread = new Thread(new Task());
            threads.add(thread);
            thread.start();
        }
        for (int i = 0; i < 5; i++) {
            threads.get(i).join();
        }
        // What will be the range of num ???
        System.out.println(ThreadTest.num);
    }
}

class Task implements Runnable {
    @Override
    public void run() {
        ThreadTest.foo();
    }

}

我告诉他们最大值为 25(如果没有竞争条件),最小值为 5(如果每次迭代时所有线程之间都存在竞争条件)。
但面试官说最小值甚至可以低于5。
这怎么可能?


我声称可能的最小值是 2。

关键是它的非原子性num++,即它是读取和写入,其间可能还有其他操作。

调用线程 T1..T5:

  • T1读0,T2读0;
  • T1写1,然后读写3次。
  • 然后T2写1;
  • 那么T1读为1;
  • 然后T2-5完成他们所有的工作
  • 最后,T1 写入 2。

(注意:结果 2 不依赖于线程数或迭代次数,前提是每个线程至少有 2 个。)

但诚实的答案是:这真的不重要。存在数据竞争,如中所定义JLS 17.4.5 https://docs.oracle.com/javase/specs/jls/se12/html/jls-17.html#jls-17.4.5:

当程序包含两个未排序的冲突访问时(第 17.4.1 节 [“如果至少其中一个访问是写入,则对同一变量的两次访问(读取或写入)被认为是冲突的。”])通过发生在关系之前,据说它包含一个数据竞赛.

(缺少发生在之前线程中动作之间的关系)

所以你不能有效地依赖它所做的任何事情。这只是不正确的代码。

(此外,我知道这个问题的答案不是因为调试多线程代码的一些来之不易的战斗,或者是深入的技术阅读:我知道这一点是因为我之前在其他地方读过这个答案。这是一个客厅技巧,仅此而已,所以询问最小值这不是一个很好的面试问题)。

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

竞争条件:整数的最小和最大范围 的相关文章

  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 临时表是线程安全的吗?

    我正在使用 SQL Server 2000 它的许多存储过程广泛使用临时表 数据库的流量很大 我担心创建和删除临时表的线程安全性 假设我有一个存储过程 它创建了一些临时表 它甚至可以将临时表连接到其他临时表等 并且还可以说两个用户同时执行存
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • 我可以通过字符串引用 WPF 元素吗?

    我希望能够通过字符串中的文本引用 C 中的 WPF 元素 像这样的事情 SelectElementFromString TestButton Opacity 1 我可以这样做吗 你真的需要吗 不知怎的 我对此表示怀疑 怎么样 XAML
  • 如何在C#中强制退出应用程序?

    我有一个多线程 C 应用程序 它有读写器锁 但它在某些计算机上给出超时异常 无法及时获取锁 我需要强制关闭所有线程 我该如何做到这一点而不会出现任何额外的异常 我认为强制应用程序退出的最佳解决方案是使用以下代码行 Environment E
  • 子目录中的递归 make

    我怎样才能订购makeMakefile中的命令在所有子目录中递归执行make命令 在子目录的 Makefile 中定义 Read 递归使用 Make http www gnu org software make manual make ht
  • 如何从 Perl 中的逗号分隔值中提取值?

    我有一个日志文件 其中包含来自不同服务器的统计信息 我仅使用正则表达式将统计信息与此日志文件分开 我正在尝试从正在运行的进程中捕获 CPU 使用情况 对于 SunOS 我有以下输出 process 10050 user1 218 59 0
  • 是否可以将 python 子进程的输出实时流式传输到网页?

    预先感谢您的任何帮助 我对 python 相当陌生 对 html 甚至更新 过去几天我一直在尝试创建一个带有按钮的网页 以在家庭服务器上执行任务 目前我有一个 python 脚本 它生成一个带有按钮的页面 See the simplifie
  • 正向索引 vs 倒排索引 为什么?

    我正在阅读有关倒排索引 由 Solr Elastic Search 等文本搜索引擎使用 的内容 据我了解 如果我们以 Person 为例 属性与 Person 的关系是倒置的 John gt PersonId 1 PersonId 2 Pe
  • 从 Sentinel C# 获取 Redis Master 地址

    我正在尝试使用哨兵来获取我的主站的连接地址 问题是哨兵仅在故障转移时发送地址 但是如果我的主站关闭并且从站被提升为主站并且我的应用程序刚刚启动它就不会知道并且不会收到原来master宕机的消息 有什么办法可以和sentinel通信并询问他认
  • 插入到JPA集合而不加载它

    我目前正在使用这样的代码将新条目添加到我的实体中的集合中 player em find Player class playerId player getAvatarAttributeOwnership add new AvatarAttri
  • 在反应本机中多个文本元素的文本换行?

    假设我有以下反应本机代码 FormatText js
  • 使用Android.mk复制/system中的多个txt文件

    目标 我想复制multiple使用 Android mk 在 system Android 设备 中创建 txt 文件 我的发现 我们可以使用两种方法复制文件 1 使用 PRODUCT COPY FILES 这是通过 devices mak
  • Excel文件对比pandas 中的 read_excel

    我正在深入研究熊猫并进行实验 至于从Excel文件中读取数据 我想知道使用 ExcelFile 和 read excel 有什么区别 两者似乎都有效 尽管语法略有不同 正如预期的那样 并且文档支持两者 在这两种情况下 文档描述的方法相同 将
  • OSX 应用程序崩溃:代码签名无效

    我有一个在 App Store 之外分发的 OSX 应用程序 因此 我使用相应的证书 开发人员 ID 应用程序证书 对其进行签名 该应用程序本身是用 Freepascal Lazarus 编写的 并且有一个用 C 编写的依赖库 我也对其进行
  • 使用代理将虚拟列添加到 Qt SQL 模型

    我使用以下命令在视图中显示 SQL 表QSql表模型 我想根据行数据显示附加状态列 为此我使用自定义Q身份代理模型我在哪里增加列数并返回data对于该新的虚拟列 该列不存在于QSql表模型 int MyProxyModel columnCo
  • 如何覆盖默认的窗口关闭操作?

    在 WPF 中 我想更改某些窗口的默认关闭行为 以便当用户单击红色关闭按钮时窗口不会关闭 它只是隐藏 并调用一些方法 我怎样才能做到这一点 尝试重写 Window xaml cs 中的 OnClosing private override
  • Xcode 4:如何自定义文件模板和项目模板?

    在 Xcode 3 中 我们 通过反复试验 发现我们可以将系统模板复制到新位置 三个可能的位置 因为 Apple 不断更改它 并自定义它们 注意 在写这个问题时 我发现 StackOverflow 上关于这个主题的大多数答案都是不正确的 A
  • .NET:将日期时间转换为十进制

    在 SQL Server T SQL 中 您可以将 DateTime 变量转换为十进制值 如下所示 CONVERT DECIMAL 20 10 mytime Sample Input 2012 07 27 08 29 20 000 Samp
  • 无法使用类型属性选择器在 IE7 中设置新的 HTML5 输入类型的样式

    看来即使使用 shivs 你也不能做类似的事情input type search 在 IE7 中设置新的 HTML5 输入元素的样式 您可以在以下位置查看示例http jsfiddle net 2tmAp http jsfiddle net
  • 使用“AJAX”下载 CSV 文件

    我正在尝试为我的网站完成一项相当简单的任务 但我不确定具体如何去做 我希望用户查看一个表格 然后单击一个按钮 此时用户可以保存该表格该表的内容作为 csv 文件 此请求有时可能非常复杂 因此我生成一个进度页面来提醒用户 除了实际生成 csv
  • 使用 BeautifulSoup 选择所有 div 兄弟姐妹

    我有一个 html 文件 其结构如下 div div div div div div div div div div div div div div 我想选择所有兄弟 div 而不选择第三个和第四个块中的嵌套 div 如果我使用find a
  • 竞争条件:整数的最小和最大范围

    我最近在一次采访中被问到这个问题 给定以下代码 静态整数的最小和最大可能值是多少num import java util ArrayList import java util List public class ThreadTest pri