目录

一、ReentrantLock是如何实现可重入的?

二、请说说CyclicBarrier和CountDownLatch的异同?

三、为什么要用线程池?Java线程池的好处?

四、Java中线程池的种类?

五、请谈谈ThreadPoolExecutor线程池的几个核心参数?


一、ReentrantLock是如何实现可重入的?

ReentrantLock内部自定义了同步器Sync,其实就是加锁的时候通过CAS算法,将线程对象放到一个双向链表中,每次获取锁的时候,看下当前维护的那个线程ID和当前请求的线程ID是否一样,一样就可重入。

二、请说说CyclicBarrier和CountDownLatch的异同?

  • CountDownLatch 是不可以重置的,所以无法重复使用,而CyclicBarrier可以重复使用栅栏;
  • CountDownLatch目的是让一个线程等待其他N个线程达到某个条件后,自己再去做某个事情;而CyclicBarrier的目的是让N多个线程互相等待直到所有线程都达到某个状态,这N个线程再继续执行各自后续操作;

三、为什么要用线程池?Java线程池的好处?

  • 重用已经存在的线程,减少了线程的创建和销毁的开销;
  • 可有效控制最大并发的线程数,提高了系统资源的使用率避免很多竞争,避免了OOM、死锁等;
  • 可以提供定时和定期的执行方式,单线程,并发数量的控制等功能;

四、Java中线程池的种类?

  • newFixedThreadPool(int nThreads)  :启动固定线程数的线程池;
  • newCachedThreadPool():按需分配的线程池;
  • newSingleThreadExecutor() :单个线程的线程池;
  • ScheduledThreadPoolExecutor():定时,定期执行任务的线程池;
  • ThreadPoolExecutor() :指定线程数的线程池;

五、请谈谈ThreadPoolExecutor线程池的几个核心参数?

  • 【1】corePoolSize:线程池中的常驻核心线程的数量(总线程量可大于等于这个值);
  • 【2】maximumPoolSize:线程池中能够容纳同时执行的最大线程数,此值必须大于等于1(总线程量不可能超越这个数值);
  • 【3】keepAliveTime:多余的空闲线程的存活时间。当前池中线程数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余线程会被销毁直到只剩下corePoolSize个线程为止;
  • 【4】unit:keepAliveTime的时间单位;
  • 【5】workQueue:任务队列,被提交但尚未被执行的任务;例如: 提交了10个任务,但是线程只有5个,于是另外5个提交但没开始执行的任务就存放到了workQueue工作队列里面,既然是队列,我们知道,实现队列的方式有很多种,比如ArrayBlockQueue、LinkedBlockQueue等等,选择不同的队列就会带来不同的问题;
  1. ArrayBlockQueue:存在一个任务过多超出队列长度
  2. LinkedBlockQueue:接受过多的任务可能会占用太多内存,造成内存崩溃;
  • 【6】threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程,一般使用默认的线程工厂即可
  • 【7】handler:拒绝策略,表示当队列满了,并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来拒绝请求执行的runnable的策略。默认拒绝策略是AbortPolicy,抛出异常阻止程序
  1. AbortPolicy:默认的拒绝策略,当提交的任务数量大于线程池中的最大数量时,会抛出RejectedExecutionException,阻止系统正常运行。
  2. DiscardPolicy:该策略默默地丢弃无法处理的任务,不予任何处理也不抛出异常,如果允许任务丢失,这是最好的一种策略(什么也不做,直接忽略).
  3. DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中,尝试再次提交当前任务(丢弃执行队列中最老的任务,尝试为当前提交的任务腾出位置)
  4. CallerRunsPolicy:“调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量(直接由提交任务者执行这个任务)

并发编程常见面试题总结三相关推荐

  1. 总结并发编程常见面试题

    Hello,你好呀,我是大白(●-●) 目录标题 并发编程常见面试题 并发编程常见面试题 在Java中守护线程和用户线程的区别? 线程与进程的区别 什么是多线程中的上下文切换 死锁与活锁的区别,死锁与 ...

  2. Java并发编程—常见面试题

    建议: 学习java并发前需要先掌握JVM知识 关于下面问题档案的详细解析都在后面推荐的相关系列文章中 一.线程安全相关 1.什么叫线程安全? 线程安全就是说多线程访问同一代码,不会产生不确定的结果. ...

  3. 并发编程常见面试题Synchronized 相 关 问 题

    Synchronized 相 关 问 题 问 题 一 : Synchronized 用 过 吗 , 其 原 理 是 什 么? 这 是 一 道 Java 面 试 中 几 乎 百 分 百 会 问 到 的 ...

  4. 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!

    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习 面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...

  5. java 并发 面试_Java 并发基础常见面试题总结

    1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启 ...

  6. “约见”面试官系列之常见面试题第三十九篇之异步更新队列-$nextTick(建议收藏)

    目录 一,前言 二,什么是异步更新队列 三,使用异步更新队列 四,结尾 一,前言 这一篇介绍有关异步更新队列的知识,通过异步更新队列的学习和研究能够更好的理解Vue的更新机制 二,什么是异步更新队列 ...

  7. “约见”面试官系列之常见面试题第三十七篇之CSS3新属性(建议收藏)

    目录 CSS3 结构(位置)伪类选择器(CSS3) 目标伪类选择器(CSS3) 属性选择器(CSS3) 伪元素选择器(CSS3,重要) CSS3盒模型(重要) 颜色模式 盒子阴影(CSS3) 文本阴影 ...

  8. “约见”面试官系列之常见面试题第三十四篇之事件冒泡、事件捕获、事件代理(建议收藏)

    对于事件的传播机制,Netscape Communicator采用的是事件捕获(event capture),IE9.Safari.Chrome.Opera和Firefox采用的是事件冒泡(event ...

  9. “约见”面试官系列之常见面试题第三十一篇之vue-router得守卫(建议收藏)

    目录 全局前置守卫 #全局解析守卫 #全局后置钩子 #路由独享的守卫 #组件内的守卫 #完整的导航解析流程 全局前置守卫 你可以使用 router.beforeEach 注册一个全局前置守卫: con ...

  10. Linux网络编程常见面试题

    概述 TCP和UDP是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(str ...

最新文章

  1. c++面试题中经常被面试官面试的小问题总结(一)(本篇偏向基础知识)
  2. 中国新冠统计20200128-20200227 统计于网络发布数据 便于数据同比分析规律 公开透明 加强防范 减少恐慌 数学来加持
  3. WINDOWS XP SP2 NTFS EFS加密文件的解密案例
  4. IntelliJ IDEA内存优化最佳实践(转)
  5. java写soap客户端_Java:简单的SOAP客户端
  6. 矩阵 计算机应用,《计算机视觉算法:基于OpenCV的计算机应用开发》 —3.3 元素级矩阵操作...
  7. linux安装 treenms
  8. PDF文件如何修改密码
  9. linux启动tongweb命令,TongWeb安装配置--Linux
  10. stm32伺服电机转速计算方法
  11. Eureka集群间通信
  12. EDK2 Build Flow
  13. 求两者较大值的max函数的用法(c++基础)
  14. 万丈高楼平地起 功夫不负有心人
  15. 我的 Typora IDEA 雅黑主题
  16. 20189215 2018-2019-2 《密码与安全新技术专题》第11周作业
  17. Lotus配置之六:IBM Lotus Note添加公共邮箱
  18. 怎么做手游性能测试?
  19. 刺激战场国际服服务器如何修改,刺激战场国际服如何更改自己的苹果id地区-无需购买海外id...
  20. 【像素与浏览器视口的细节】及移动web设置“width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no“原因

热门文章

  1. 基于android p的miui,小米8青春版终于迎来基于AndroidP的MIUI10系统,米粉欢呼
  2. Softmax 回归 + 损失函数 + 图片分类数据集 动手学深度学习v2 pytorch
  3. 自动驾驶 10-2: 惯性测量单元 (IMU)The Inertial Measurement Unit (IMU)
  4. 数据操作(基于MXNET框架)
  5. 说明assert()的作用:assert()是一个调试程序时经常使用的宏,在程序执行时计算括号内的表达式,如果表达式为假,程序报告错误,并终止执行;若表达式为真,则继续执行后面的语句。
  6. 谈谈考虑了多普勒的信道
  7. javafx 与java,java桌面应用程序和javafx有什么区别?
  8. linux常用分区大小,Linux基本知识点总结——硬盘分区及LVM
  9. 和平精英有电脑版吗_和平精英电脑版灵敏度调多少 CP端灵敏度设置攻略
  10. 【2019南昌邀请赛网络赛 B Greedy HOUHOU BZOJ 2957 楼房重建】线段树+二分