ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-02-13 08:33:25  阅读:175  来源: 互联网

标签:输出 面试题 数字 方式 CAS 代码 有意思 线程


开心一刻

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

  强调一句很重要的心里话:祝大家在 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 来控制,是一种比较理想的做法

标签:输出,面试题,数字,方式,CAS,代码,有意思,线程
来源: https://www.cnblogs.com/youzhibing/p/14399143.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有