接上一篇https://blog.csdn.net/wo2huoa/article/details/104213225,对于这道多线程打印题,我一开始的代码如下,与上一篇博文唯一的区别在于,当数组循环终止的时候,没有将锁释放掉,即没有调用lock.unlock(),结果发现程序输出完数组后,一直没有退出。

public class FourThread_0 implements Runnable {private static final int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};private static Lock lock = new ReentrantLock();private static Condition condition = lock.newCondition();//当前循环到的数组下标private static volatile int currentCount = 0;//打印方法实现private PrintFunction printFunction;//线程标志private int flag;public FourThread_0(int flag, PrintFunction printFunction) {this.flag = flag;this.printFunction = printFunction;}/*** 检查当前数组元素应该由哪个线程执行打印** @param n 数组元素* @return 线程标志*/private int checkFlag(int n) {if (n % 15 == 0) {return 0;} else if (n % 5 == 0) {return 1;} else if (n % 3 == 0) {return 2;} else {return 3;}}@FunctionalInterfaceinterface PrintFunction {void print(int n);}@Overridepublic void run() {while (true) {lock.lock();//数组循环结束之后直接returnif (currentCount >= array.length) {return;}while (checkFlag(array[currentCount]) % 4 != flag) {try {condition.await();} catch (InterruptedException e) {e.printStackTrace();}if (currentCount >= array.length) {//数组循环完之后直接returnreturn;}}printFunction.print(array[currentCount]);currentCount++;condition.signalAll();lock.unlock();}}public static void main(String[] args) {new Thread(new FourThread_0(0, (n) -> System.out.print("C"))).start();new Thread(new FourThread_0(1, (n) -> System.out.print("B"))).start();new Thread(new FourThread_0(2, (n) -> System.out.print("A"))).start();new Thread(new FourThread_0(3, System.out::print)).start();}}

这时候,开始查看问题是什么导致的

1. 使用jps命令查看java进程

2. 查看线程状态,并将线程结果打印到文件中

3. 查看线程状态

我们发现4个线程,只有执行return操作的线程结束了,其他三个都在WAITING状态,可以得出结论,如果线程结束之前没有释放掉lock,那么这个lock会一直没有被释放掉,阻塞其他线程,其他线程都处于等待状态,导致内存泄漏。

阿里巴巴社招笔试题——多线程打印(2)相关推荐

  1. 阿里巴巴社招笔试题——多线程打印

    前一段时间参加了一次阿里的面试,有一道远程代码题,当场没有做出来,现在补上,题目内容大概如下: 给定一个数组[1,2,3,4,5,6,7,8,9....,15],要求遍历数组,遇到可以同时被3和5整除 ...

  2. 邮储社招Java笔试题_2019年及历年中国邮政储蓄银行社招笔试题和参考答案6套

    2019年及历年中国邮政储蓄银行社招笔试题和参考答案6套 目录: 1.2016年中国邮政储蓄银行社会招聘笔试题和参考答案 2.2019年5月中国邮政储蓄银行社会招聘笔试题和参考答案 3.2019年中国 ...

  3. 第一次社招笔试题回顾(全基础题)

    第一次社招笔试题回顾 在上个月裸辞之后,休息了近一个月,最近开始找工作,发现很多基础自己忘了挺多的.从校招过后,到现在,将近1年多没有怎么做过算法题,Eclipse,Idea这几个都用的比较少. 一家 ...

  4. 邮政社招笔试题库_工商银行招聘考试题库13套和参考答案

    目录: 1. xx工商银行招聘面试题(笔试真题) 2. 中国工商银行xx分行招聘笔试题无答案(行测部分) 3. 中国工商银行客户经理招聘笔试题和答案 4. 中国工商银行总行校园招聘笔试题和参考答案(行 ...

  5. 邮政社招笔试题库_2016年中国邮政储蓄银行招聘考试笔试题库内容试卷历年真题...

    邮政银行招聘考试笔试复习资料 历年考试真题 建议报考的同学提前做好复习准备 ,考试复习资料可以到"考佳卜资料网" 上面找找, 资料确实不错, 比较有针对性, 资料都是上次参加考试的 ...

  6. 深度剖析!阿里巴巴社招面试题答案总结分享,希望对大家有帮助!

    阿里巴巴研发面经 阿里中间件研发面经 研发工程师(Java) 阿里一面: 1 自我介绍 2 项目中做了什么,难点呢. 3 Java的线程池说一下,各个参数的作用,如何进行的. 4 Redis讲一下 5 ...

  7. 爆肝三天整理!2021年阿里巴巴社招面试题总结,三轮技术面+HR面,总结的明明白白!

    前言: 今年是我第一次正式面试,期间看了很多网上的帖子,给了我很大帮助.面试结束后一直想着将面经整理出来,但实验室一直有事,老师天天找,所以一直没有找到机会.端午终于有些空闲时间,赶紧将面经整理出来, ...

  8. 邮政社招笔试题库_中国邮政 招聘考试试题及答案 总括版

    1 中国邮政招聘考试精华试题 一.单项选择题(共 60 题,每题 1 分.每题的备选项中,只有 1 个最符合题意) 1.根据<邮政法>的规定,在邮件寄递过程中,邮政企业的权利不包括( ). ...

  9. 邮政社招笔试题库_中国邮政招聘考试试题及答案--总括版

    中国邮政招聘考试精华试题 一.单项选择题(共 60 题,每题 1 分.每题的备选项中,只有 1 个最符合题意) 1 .根据<邮政法>的规定,在邮件寄递过程中,邮政企业的权利不包括( ). ...

最新文章

  1. vi命令,印在杯子上,还是印在脑子里。
  2. python使用教程pandas-Python之Pandas使用教程
  3. ajax实现多选 radio true,jQuery操作radio、checkbox、select的方法总结
  4. 什么是is research?
  5. boost::partial_sort相关的测试程序
  6. pdf转图片 java_有将pdf文件转图片的格式方法吗?
  7. 计算机用于数据管理经历了,管理系统中计算机应用--期中测验答案
  8. 整理struct sockaddr和struct sockaddr_in
  9. 关键字值集合和IDictionary
  10. cfa英语不好的怎么学_考CFA,英语太差怎么办?
  11. 动漫系列美化XP主题风暴下载
  12. ubuntu磁盘清理
  13. 【 react】react实现页面后退按钮(goBack())
  14. linux tf2 中文,tf2+cnn+中文文本分类优化系列(2)
  15. 第二章 一阶逻辑 2.2 一阶逻辑合式公式及解释
  16. 常用转义字符例如amp的含义
  17. Ubuntu 18.04 安装 GeForce RTX 3090
  18. antd vue表单验证_ant design vue框架中自定义表单或单个表单框验证
  19. 第六十八篇:从ADAS到自动驾驶(一):自动驾驶发展及分级
  20. 一文搞懂设计模式--模板模式

热门文章

  1. Unity+Vuforia实现AR图片识别应用
  2. 微软与GitHub百人签名,力挺996.ICU项目
  3. Linux下四款Web服务器压力测试工具…
  4. Python手写强化学习Q-learning算法玩井字棋
  5. 大学英语综合教程一 Unit 8 课文内容英译中 中英翻译
  6. 数据挖掘-朴素贝叶斯算法的R实现
  7. ubuntuv20启动界面美化_聊一聊我的win10系统美化/使用习惯
  8. 咸鱼Maya笔记—NURBS放样成型法
  9. 重磅丨FIL10月减产即将到来 2分钟了解FIL分配模型
  10. 拉链表断链、交叉链判断及处理方式