专栏首页开发技术记一个有意思的面试题 → 线程交替输出问题

记一个有意思的面试题 → 线程交替输出问题

开心一刻

大年初一,一起嗨起来!!!

  强调一句很重要的心里话:祝大家在 2021 年,健康好运,平安幸福!

问题描述

  用两个线程,一个输出数字,一个输出字母,交替输出 1A2B3C4D...26Z

  该如何实现?

解决方式

  据说解决方式有上百种,但有些是脱了裤子放屁,有些是民间偏方,所以没必要全部都知道(其实楼主也不知道具体是哪一百多种)

  掌握常用的那几个就好;为了方便,我们就以 1234567 和 ABCDEFG 为例进行演示

  synchronized + wait + notify

  如果我们对 JUC 不熟的话,那这种方式往往是我们最容易想到的

  这种方式,相信大家都能写出来,但是这里留三个问题(面试点)

  1、线程代码中, try 中的 notify() 能否与 wait() 交换位置,为什么

  2、线程代码中, for 下的 notify() 能否去掉,为什么

  3、上面的代码能否保证一定先输出数字,为什么,如何保证一定先输出数字

  ReentrantLock + Condition + await + signal

  很多场景下,用 ReentrantLock 可以替代 synchronized ,而在交叉输出这个场景中,同样可以替代

  这种方式,写出来应该也不难,同样留三个问题(面试点)

  1、线程代码中, for 中的 signal() 能否与 await() 交换位置,为什么

  2、线程代码中, for 下的 signal() 能否去掉,为什么

  3、上面的代码能否保证一定先输出数字,为什么,如何保证一定先输出数字

  LockSupport + park + unpark

  估计很多人都没想到这种方式,直接上代码

这是目前最优的解决方式,照样留四个问题(面试点)

  1、 t1.start() 能否与 t2.start() 交换位置,为什么

  2、线程 t1 中的 LockSupport.unpark(t2) 在线程 t2 中的 LockSupport.park() 之前执行会怎么样,为什么

  3、上面的代码能否保证一定先输出数字,为什么

  4、 LockSupport 的 park 、 unpark 与 Object 的 wait 、 notify 有什么异同

  CAS

  这种方式可能也比较难想到,直接上代码

  这种方式也许不太好理解,留四个问题(面试点)加深理解

  1、线程代码中, while 条件为什么是 !=,而不是 ==

  2、上面的代码能否保证一定先输出数字,为什么

  3、CAS 的优缺点是什么,适用于什么场景

  CAS + AtomicInteger

  其实就是 CAS 的一个变种,直接上代码

  CAS + AtomicReference

  也是 CAS 的一个变种,直接上代码

  TransferQueue

  一般很难想象到这种方式,但却是很有趣的一种实现方式

  如果不了解 TransferQueue ,那这种方式就想不到;同样留一个问题(面试点)

  1、上面的代码能否保证一定先输出数字,为什么

  BlockingQueue

  一般也比较难想到这种方式,有所了解就好

  PipedStream

  效率很低,知道有这么回事就好

总结

  1、示例代码地址:juc-demo

  2、需要掌握的实现方式

    synchronized、ReentrantLock、LockSupport、CAS、TransferQueue 这几种实现方式必须掌握

    其他的了解就好

  3、如何保证一定先输出数字

    上面介绍的那些方式中,有些是不能保证一定先输出数字的,而有些是能保证一定先输出数字的

    不能保证先输出数字的,可以用 CountDownLatch 来控制,是一种比较理想的做法

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试题精选:两个线程按顺序交替输出1-100

    陆陆续续,各个公司的校招季都开始了,我也成为了我司的校招面试官,最近也面了不少同学了,面试过程中也发现了很多问题,即有面试者的、也有面试官的、更有自己的问题,这...

    xindoo
  • 一道很有意思的Redis面试题,我选出了一些优质评论

    起源于我在一个短视频中分享的一道面试题,当然,这道面试题我确实在工作中用过,只是业务场景不同。

    Java艺术
  • 面试题13(一个具有生命的线程有哪些状态)

    考点:考察求职者对线程的理解 出现频率:★★★ 【面试题解析】线程的状态表示线程在某时间段内进行的活动和将要进行的任务程有创建、就绪、运行、阻塞、死亡5种状态。...

    Java学习
  • 面试需要注意哪些问题?这里有程序员求职面试的66个细节整理

    要想面试成功,这不仅仅是关于情商、智商、逆商、专业能力等个人与个人的较量,更是个人与群体的博弈。这个时候掌握一些我多年积累下来的锦囊,无疑是事半功倍的。

    Android技术干货分享
  • 「数据结构与算法」力扣实战之移动零、盛最多的水、爬楼梯

    给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

    三钻
  • 【源头活水】想为特征交互走一条新的路

    “问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精...

    马上科普尚尚
  • Jmeter(十一) - 从入门到精通 - JMeter逻辑控制器 - 下篇(详解教程)

    Jmeter官网对逻辑控制器的解释是:“Logic Controllers determine the order in which Samplers are ...

    北京-宏哥
  • 写一个无配置格式统一的日志

    大量项目在使用logback记日志,有部分项目使用日志混乱,格式不统一,多数人搞不懂配置文件,导致配置错误,现在需要开发一套统一的、少配置的日志组件,使用方便

    宜信技术学院
  • ALL in BERT:一套操作冲进排行榜首页

    好久不打比赛,周末看到“全球人工智能技术创新大赛”已经开打了一段时间,前排分数冲的有点凶,技痒的我看到了一道熟悉的赛题——小布助手对话短文本语义匹配,由于在...

    炼丹笔记
  • 手撕面试题:多个线程顺序执行问题

    大家在换工作面试中,除了一些常规算法题,还会遇到各种需要手写的题目,所以打算总结出来,给大家个参考。

    海星
  • 双非本科毕业一年的Android开发渣渣斩获腾讯系公司offer,一年经验都考察什么?

    这里是双非本科毕业一年的Android开发渣渣,坐标深圳。在毕业和准备面试的时候看了牛客上的许多面经,因此现在准备回馈分享一波我的面试经历。

    Android技术干货分享
  • 《深度学习推荐系统》-阅读笔记

    本文是《深度学习推荐系统》一书的阅读笔记和思维导图,建议大家入手一本王喆老师的新书,看完绝对会收获颇丰!

    guichen1013
  • 【面试必备】手撕代码,你怕不怕?

    这绝对是属于重点了,不管是考察对于该重要模型的理解还是考察代码能力,这都是一道很好的考题,所以很有必要的,我们先来回顾一下什么是生产者-消费者问题;

    我没有三颗心脏
  • 【面试必备】手撕代码,你怕不怕?

    这绝对是属于重点了,不管是考察对于该重要模型的理解还是考察代码能力,这都是一道很好的考题,所以很有必要的,我们先来回顾一下什么是生产者-消费者问题;

    Java3y
  • 面阿里P7,竟问这么简单的题目?

    作为面试官,不管是社招还是校招,我都有多年的经验了。在我参与的所有面试中,我都尽量期望能让候选人有所收获。(当然也期望自己在面试中也有所收获)

    程序猿石头
  • 不停机还能替换代码?6年的 Java程序员表示不可思议

    在日常开发上线过程中,我们多多少少都会遇到下边这些问题,苦于无法在线调试,「只能通过老鸟的经验来硬分析bug,效率上不去还总开口问别人答疑解惑,多少有些不好意思...

    程序员内点事
  • 【面试必备】手撕代码,你怕不怕?

    这绝对是属于重点了,不管是考察对于该重要模型的理解还是考察代码能力,这都是一道很好的考题,所以很有必要的,我们先来回顾一下什么是生产者-消费者问题;

    java架构师
  • 【小家java】记录Java守护线程使用时因忽略细节,导致的一个线上问题的排查过程(守护线程异常退出)

    记得我在之前某一篇博文里讲到过一个案例:使用java的守护线程来模拟redis缓存的过期时间设定。

    YourBatman
  • 不停机还能替换代码?6年的 Java程序员表示不可思议

    在日常开发上线过程中,我们多多少少都会遇到下边这些问题,苦于无法在线调试,「只能通过老鸟的经验来硬分析bug,效率上不去还总开口问别人答疑解惑,多少有些不好意思...

    Java宝典

扫码关注云+社区

领取腾讯云代金券