并发编程常见面试题总结三
目录
一、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等等,选择不同的队列就会带来不同的问题;
- ArrayBlockQueue:存在一个任务过多超出队列长度
- LinkedBlockQueue:接受过多的任务可能会占用太多内存,造成内存崩溃;
- 【6】threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程,一般使用默认的线程工厂即可
- 【7】handler:拒绝策略,表示当队列满了,并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来拒绝请求执行的runnable的策略。默认拒绝策略是AbortPolicy,抛出异常阻止程序
- AbortPolicy:默认的拒绝策略,当提交的任务数量大于线程池中的最大数量时,会抛出RejectedExecutionException,阻止系统正常运行。
- DiscardPolicy:该策略默默地丢弃无法处理的任务,不予任何处理也不抛出异常,如果允许任务丢失,这是最好的一种策略(什么也不做,直接忽略).
- DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中,尝试再次提交当前任务(丢弃执行队列中最老的任务,尝试为当前提交的任务腾出位置)
- CallerRunsPolicy:“调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量(直接由提交任务者执行这个任务)
并发编程常见面试题总结三相关推荐
- 总结并发编程常见面试题
Hello,你好呀,我是大白(●-●) 目录标题 并发编程常见面试题 并发编程常见面试题 在Java中守护线程和用户线程的区别? 线程与进程的区别 什么是多线程中的上下文切换 死锁与活锁的区别,死锁与 ...
- Java并发编程—常见面试题
建议: 学习java并发前需要先掌握JVM知识 关于下面问题档案的详细解析都在后面推荐的相关系列文章中 一.线程安全相关 1.什么叫线程安全? 线程安全就是说多线程访问同一代码,不会产生不确定的结果. ...
- 并发编程常见面试题Synchronized 相 关 问 题
Synchronized 相 关 问 题 问 题 一 : Synchronized 用 过 吗 , 其 原 理 是 什 么? 这 是 一 道 Java 面 试 中 几 乎 百 分 百 会 问 到 的 ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习 面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...
- java 并发 面试_Java 并发基础常见面试题总结
1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启 ...
- “约见”面试官系列之常见面试题第三十九篇之异步更新队列-$nextTick(建议收藏)
目录 一,前言 二,什么是异步更新队列 三,使用异步更新队列 四,结尾 一,前言 这一篇介绍有关异步更新队列的知识,通过异步更新队列的学习和研究能够更好的理解Vue的更新机制 二,什么是异步更新队列 ...
- “约见”面试官系列之常见面试题第三十七篇之CSS3新属性(建议收藏)
目录 CSS3 结构(位置)伪类选择器(CSS3) 目标伪类选择器(CSS3) 属性选择器(CSS3) 伪元素选择器(CSS3,重要) CSS3盒模型(重要) 颜色模式 盒子阴影(CSS3) 文本阴影 ...
- “约见”面试官系列之常见面试题第三十四篇之事件冒泡、事件捕获、事件代理(建议收藏)
对于事件的传播机制,Netscape Communicator采用的是事件捕获(event capture),IE9.Safari.Chrome.Opera和Firefox采用的是事件冒泡(event ...
- “约见”面试官系列之常见面试题第三十一篇之vue-router得守卫(建议收藏)
目录 全局前置守卫 #全局解析守卫 #全局后置钩子 #路由独享的守卫 #组件内的守卫 #完整的导航解析流程 全局前置守卫 你可以使用 router.beforeEach 注册一个全局前置守卫: con ...
- Linux网络编程常见面试题
概述 TCP和UDP是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(str ...
最新文章
- c++面试题中经常被面试官面试的小问题总结(一)(本篇偏向基础知识)
- 中国新冠统计20200128-20200227 统计于网络发布数据 便于数据同比分析规律 公开透明 加强防范 减少恐慌 数学来加持
- WINDOWS XP SP2 NTFS EFS加密文件的解密案例
- IntelliJ IDEA内存优化最佳实践(转)
- java写soap客户端_Java:简单的SOAP客户端
- 矩阵 计算机应用,《计算机视觉算法:基于OpenCV的计算机应用开发》 —3.3 元素级矩阵操作...
- linux安装 treenms
- PDF文件如何修改密码
- linux启动tongweb命令,TongWeb安装配置--Linux
- stm32伺服电机转速计算方法
- Eureka集群间通信
- EDK2 Build Flow
- 求两者较大值的max函数的用法(c++基础)
- 万丈高楼平地起 功夫不负有心人
- 我的 Typora IDEA 雅黑主题
- 20189215 2018-2019-2 《密码与安全新技术专题》第11周作业
- Lotus配置之六:IBM Lotus Note添加公共邮箱
- 怎么做手游性能测试?
- 刺激战场国际服服务器如何修改,刺激战场国际服如何更改自己的苹果id地区-无需购买海外id...
- 【像素与浏览器视口的细节】及移动web设置“width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no“原因
热门文章
- 基于android p的miui,小米8青春版终于迎来基于AndroidP的MIUI10系统,米粉欢呼
- Softmax 回归 + 损失函数 + 图片分类数据集 动手学深度学习v2 pytorch
- 自动驾驶 10-2: 惯性测量单元 (IMU)The Inertial Measurement Unit (IMU)
- 数据操作(基于MXNET框架)
- 说明assert()的作用:assert()是一个调试程序时经常使用的宏,在程序执行时计算括号内的表达式,如果表达式为假,程序报告错误,并终止执行;若表达式为真,则继续执行后面的语句。
- 谈谈考虑了多普勒的信道
- javafx 与java,java桌面应用程序和javafx有什么区别?
- linux常用分区大小,Linux基本知识点总结——硬盘分区及LVM
- 和平精英有电脑版吗_和平精英电脑版灵敏度调多少 CP端灵敏度设置攻略
- 【2019南昌邀请赛网络赛 B Greedy HOUHOU BZOJ 2957 楼房重建】线段树+二分