您如何思考并预测这样的线程问题的输出?

2024-01-13

我正在准备 SCJP,多线程一直是我最不稳定的领域,主要是因为我不知道如何查看多线程代码并逐步完成它。到目前为止,我的方法是用英语写下每个线程中可能发生的情况,并测试一些线程随机交叉的情况,这确实是一种偶然且耗时的方法。所以我想看看专业人士会如何处理。您是否愿意阅读下面的代码(这是给我带来麻烦的最新问题)并在计算出可能的输出时写下您的想法(请仅与代码相关的内容:)?问题附带的选择在最后。我所寻找的不是我已有的解决方案,而是如何在考试中有效地得出解决方案。

是的,我知道这个问题没有精确的答案,等等。接受的投票将投给最清晰、最容易模仿的答案,好吧:)

感谢大家!

问题:以下哪些答案是可能的输出?

public class Threads1 {

    int x = 0;

    class Runner implements Runnable {

        public void run() {
            int current = 0;
            for (int i = 0; i < 4; i++) {
                current = x;
                System.out.print(current + ", ");
                x = current + 2;
            }
        }
    }

    public static void main(String[] args) {
        new Threads1().go();
    }

    public void go() {
        Runnable r1 = new Runner();
        new Thread(r1).start();
        new Thread(r1).start();
    }
}

选择(选择所有适用的选项):

A、0、2、4、4、6、8、10、6、

B、0、2、4、6、8、10、2、4、

C.0、2、4、6、8、10、12、14、

D、0、0、2、2、4、4、6、6、8、8、10、10、12、12、14、14、

E、0、2、4、6、8、10、12、14、0、2、4、6、8、10、12、14、


A and C(假设问题是这些答案中哪些是可能的输出?)

当然,困难的部分不是找到可能的解决方案。相反,它是认真地审视那些你认为是的not可能并尝试让自己相信你有充分的理由解释为什么它不可能and你已经消除了所有绕过你的理由的方法。

到目前为止,我的方法是用英语写下每个线程中可能发生的事情......

您需要找出哪个线程打印了每个数字。下面是我能想到的最有效、最简洁的格式,可以在您处理各种可能性时轻松划掉/擦除/重写。意识到:

  • 一旦找到可能的答案move on。无论现实世界中不可能出现这种情况,还是存在其他可能(或不可能)的组合,都没关系。只要你找到了1种可能性,那就够了move on.

  • 首先尝试最简单的方法,例如假设每个数字为 T1,直到您遇到一个不可能是 T1 的数字,因此您填写 T2,依此类推。希望您能在没有矛盾(或容易解决的矛盾)的情况下到达最后。一旦找到了可能的组合,就继续吧。

  • 请随意跳至排除快速解决可能的问题,以便您可以专注于可能不可能的问题。

这是我的草稿纸/工作表的最终编辑(附有我的心理注释):

A. 0, 2, 4, 4, 6, 8, 10, 6,
   1  1  1  2  2  2   2  1     <- possible threads that produced this output - possible solution

B. 0, 2, 4, 6, 8, 10, 2, 4,
   1  2  2  2  2   ?  1        <- to print second '2', T1 interrupted between L10/L11; 4 passes of T2 used up

C. 0, 2, 4, 6, 8, 10, 12, 14,
   1  1  1  1  2   2   2   2   <- possible solution - simplest solution (T2 waits until T1 is completely done) - doesn't matter that it isn't likely, just that is possible

D. 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14,
   1  2  1  2  1  2  1  2  1  2   ?    <- threads used up

E. 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14,
   1  1  1  1  2   2   2   2  ?   <- threads used up

Note:

http://download.oracle.com/javase/tutorial/essential/concurrency/atomic.html http://download.oracle.com/javase/tutorial/essential/concurrency/atomic.html

  • 对于引用变量和大多数原始变量(除 long 和 double 之外的所有类型),读取和写入都是原子的。
  • ...

原子操作不能交错,因此可以使用它们而不必担心线程干扰。

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

您如何思考并预测这样的线程问题的输出? 的相关文章

  • 在不支持线程的程序加载的共享库中使用 C++11 多线程

    我目前正在尝试在共享库中使用 C 11 多线程 该库加载到 Linux 上的主程序 用 C 编写 中 这是一个大型模拟程序的一部分 我无法更改有关库加载的任何内容或更改一般的主程序 主程序是用 gcc 4 1 2 编译的 我没有它的源代码
  • 是否有任何简单(且最新)的 Java 框架可用于在 Swing 应用程序中嵌入电影?

    我正在构建一个小型 Swing 应用程序 我想在其中嵌入一部电影 重要的是 这个应用程序是一个 WebStart 应用程序 并且该库应该能够打包在我启动的 jnlp 中 即 不依赖于本机库 我知道并尝试过 JMF 但我认为与其他框架相比 其
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 在另一个模块中使用自定义 gradle 插件模块

    我正在开发一个自定义插件 我希望能够在稍后阶段将其部署到存储库 因此我为其创建了一个独立的模块 在对其进行任何正式的 TDD 之前 我想手动进行某些探索性测试 因此 我创建了一个使用给定插件的演示模块 到目前为止 我发现执行此操作的唯一方法
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio

随机推荐

  • Android 表格布局中的右对齐列

    我想绘制一个表格 其中最后一列应位于表格的最右侧 表格行如下所示 Admin 2 New Network 2 New 事情应该是这样的 Admin 2 New Network 2 New XML
  • “未绑定到有效相机”CameraX 错误

    我试图遵循谷歌的 CameraX入门 代码实验室 我尝试用Java而不是Kotlin来完成它 但是当我运行它并尝试拍照时 它给了我一个错误 说未绑定到有效的相机 我在代码中找不到错误所在 我检查了 logcat 它说表面可能存在问题 它可能
  • 检测实际的形式变化?

    是否有一种现成的方法 也许在一个框架中 来检测表单是否具有changed与其原始值相比 onchange 事件不会执行 因为无论实际更改如何 它都会触发 例如 我可以使用两个 onchange 事件勾选一个复选框 然后再次关闭 最后的手段是
  • 索引布尔列与日期时间列的查询性能

    如果索引设置为datetime键入列 而不是boolean输入列 并且查询是在该列上完成的 在我当前的设计中 我有两列 is active小整数 1 indexed deleted at约会时间 查询是SELECT FROM table W
  • 选择哪个 log4j 门面?

    本质上 我正在寻找与 log4j 具有相同行为 配置 日志记录级别的东西 但缺少一些功能 例如格式化日志记录 请参阅here https stackoverflow com questions 920458 and here https s
  • 如何在 Xcode 中使用 cocos2d?

    我下载了最新版本的 cocos2d 但我对如何在当前项目中使用它感到困惑 谁能告诉我如何在 xcode 中使用它 我正在设计一个二维迷宫 我必须进口一些东西吗 任何形式的帮助将不胜感激 是的 您需要将cocos2d文件拖到您的项目中 然后它
  • boost.org 的 Spirit 解析器生成器框架有哪些缺点?

    在几个问题中我看到了以下建议Spirit http www boost org doc libs 1 37 0 libs spirit classic index html解析器生成器框架来自boost org http www boost
  • ClassCastException:android.app.Application

    导致错误的类如下 package com extrasmart import android app Activity import android os Bundle import android view View import and
  • 真正可复制的 Docker 容器?

    有一种安全趋势叫做可重复的构建 https en wikipedia org wiki Reproducible builds 其目标是有一种方法来创建输出二进制文件的位精确副本 以便用户可以验证在互联网上找到的版本是否值得信赖 Docke
  • 如何测试 ColdFusion 结构中是否存在变量?

    我想测试一下
  • Microsoft Graph 访问令牌刷新

    我正在编写一个应用程序 该应用程序使用 OAuth 2 0 客户端凭据授予流程 来获取用于调用 Microsoft Graph API 的访问令牌 应用程序以自身身份进行身份验证 而不是代表登录用户进行身份验证 我的代码基于此来自微软的例子
  • 如何在 pdb 中等待协程

    我正在使用异步库 asyncpg https github com MagicStack asyncpg 并且我想调试一些异步调用来查询数据库 我放置了一个 pdb 断点并想尝试一些查询 pdb await asyncpg fetch se
  • 提交表单时将输入文本转换为小写

    我有一个表单 其中有一个文本字段配有提交按钮 单击提交按钮后 它会从第一个 php 页面重定向到第二个 php 页面 索引 php
  • 使用现有的持久卷声明部署 bitnami/mysql helm 图表

    我正在尝试部署比特纳米 mysql https github com bitnami charts tree master bitnami mysql我里面的图表minikube https minikube sigs k8s io doc
  • 服务器启动时执行的内容与请求传入时执行的内容是什么?

    我一直在 Django 中进行一些类黑客攻击 我从 settings py 中调用我的更改 因为我认为它会先于其他任何事情运行 然而 我刚刚遇到了一种情况 这对我不起作用 那么 还有其他地方吗aftersettings py 我可以保证服务
  • 将 TrueType 字体加载到 OpenCV

    我们可以加载自定义 TrueType 字体并将其与cv2 putText功能 font cv2 FONT HERSHEY SIMPLEX cv2 putText img OpenCV 10 500 font 4 255 255 255 2
  • 无效方差:类型参数“T”在“xxx.IItem.GetList()”上必须始终有效。 “T”是协变的[重复]

    这个问题在这里已经有答案了 为什么下面的代码会出现错误 无效方差 类型参数 T 必须始终有效 UserQuery IItem GetList T 是协变的 public interface IFoo public interface IBa
  • 如何使用java代码调用solr进行优化

    不在壳下 我想使用 Java 代码调用优化并在优化过程完成时收到通知 只需发出请求即可 solr update optimize true从任何可以访问 Solr 服务器的地方 任何东西 例如 curl http localhost 898
  • 如何像 MS Access 一样使用目录路径连接 MySQL 数据库文件(.sql)?

    抱歉 也许这是我第二次问这个问题 因为没有得到任何答案 这是我的代码 try File f new File Database sql if f exists Class forName com mysql jdbc Driver newI
  • 您如何思考并预测这样的线程问题的输出?

    我正在准备 SCJP 多线程一直是我最不稳定的领域 主要是因为我不知道如何查看多线程代码并逐步完成它 到目前为止 我的方法是用英语写下每个线程中可能发生的情况 并测试一些线程随机交叉的情况 这确实是一种偶然且耗时的方法 所以我想看看专业人士