我正在准备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,6,8,10,

B. 0,

C.0,12,14,

D.0,

E.0,

解决方法

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

当然,当您找到可能的解决方案时,困难的部分不是.但是,它要看看你认为是不可能的,并试图说服自己,你有一个坚实的理由,为什么不可能,你已经消除了所有的方法来摆脱你的理由.

So far my approach has been to write down in English what might be happening in each thread …

你需要弄清楚每个号码打印哪个线程.以下是我可以想到的最有效率,简洁的格式,并且使您可以在完成可能性时轻松交叉/擦除/写入.实现:

>一旦找到可能的答案就行了.如果不可能在现实世界中或者可能存在其他可能的(或不可能的)组合,这并不重要.只要你发现一个可能性,那就是你需要继续前进的一切.
>首先尝试最简单的方法,例如假设T1为每个数字,直到你打到不能T1的数字,所以你填写T2,等等..希望你到最后没有矛盾(或矛盾很容易解决).找到可能的组合后,继续.
>随意跳过去,尽快消除可能的,所以你可以专注于可能不可能的事情.

这是我的划痕纸/工作表的最终编辑(附加了我的精神注释):

A. 0,1  1  1  2  2  2   2  1     <- possible threads that produced this output - possible solution

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

C. 0,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,1  2  1  2  1  2  1  2  1  2   ?    <- threads used up

E. 0,1  1  1  1  2   2   2   2  ?   <- threads used up

注意:

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

  • Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double).

Atomic actions cannot be interleaved,so they can be used without fear of thread interference.

java – 你如何思考和预测这样的线程问题的输出?的更多相关文章

  1. java – 你如何思考和预测这样的线程问题的输出?

    我正在准备SCJP,多线程一直是我最肮脏的区域,主要是因为我不知道如何看多线程代码,并通过它.到目前为止,我的方法是用英文写下每个线程可能发生的情况,并测试一些线程随机相交的情况,这是一个真正的命中和遗漏和耗时的方法.所以我想看看一个专业人士会如何去做.您是否愿意阅读下面的代码,并记下你的头脑,你制定出可能的输出?选择:A.0,2,4,6,8,10,B.0,C.0,12,14,D.0,E.0,解决方法A和C(假设问题是哪些答案是可能的输出?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部