飞越面试官(二)--JUC
大家好!我是本号唯一官方指定没头屑的小便--怕屁林。
JUC是什么东西?我相信很多经验尚浅的小伙伴部分都会为之一懵,我也是,三个字母都会读,连在一起就不知道在说什么,其实如果把它的全称写出来,“java.util.concurrent”,这就很清楚了。这个jar包的内容就是,atomic类、volatile、cas、concurrentHashMap、CountDownLatch、CyclicBarrier、Semaphore、实现Callable接口创建线程,ReentrantLock同步锁,ReadWriteLock读写锁,线程池。
围绕上面列举的JUC下的类,几乎都是面试的重灾区,不问才是奇怪。
ReentrantLock了解吗?嗯。功能如其名,它是一把锁,而且还是可重入的,这个和synchriozed是类似的。它作用于代码片段,可以通过lock方法去竞争锁,当然也提供了顺序上锁的形式,这synchriozed是做不到的,它的底层原理是AQS,释放锁要使用unlock方法,否则会一直阻塞改代码判断,同时也提供了一些方法用于感知锁的状态和响应中断,还可以通过condition来唤醒指定的线程。
你说AQS?是的,它位于java.util.concurrent.locks包下,AQS是一个用来构建锁和同步器的框架,例如ReentrantLock和Semaphore等等,原理是被请求的共享资源空闲,那么当前空闲的线程就会被标记为运行状态,资源也被标记为被锁定,需要一套线程阻塞等待以及被唤醒时锁分配的机制,AQS使用CLH队列锁(自旋锁,先来先服务,保证无饥饿)实现,即将暂时获取不到锁的线程放在队列中。
简单说下CAS吧!全称就是compare and swap,通过保存一个旧值,更新时用旧值来比较当前值,没有改变则更新为更新后的值。像atomicInteger就是利用volatile修饰值,然后使用上面说的cas这个方法来做。
concurrentHashMap是怎么保证线程安全的?与Hashtable不同,concurrentHashMap不会锁住整个表,JDK7及之前是做了一个分段锁,将表分成16段,每段单独加锁,每段的里面是一个不会互相干扰的数组。JDK8以及之后,分段锁的做法成了CAS加synchroized,段里面的数组超过8个之后会成为红黑树。
Volatile的作用?它可以 保证每个线程都可以获取到最新的值,或者说是从主内存中读取的值。同时也可以用于阻止指令重排,像一个变量初始,第一步是开辟内存,第二步是内存赋值,第三步是内存指向引用。第二和第三步是可以不一定的取决于JVM,用了volatile之后不会调换这个步骤。
用没用过多线程呢?按我理解,用了线程池和CountDownLatch之类的,也就是用过多线程了。这里说下ContDownLatch,它可以用于控制指定数量线程的开始,通过调用countDown方法标记执行完成,最后调用await方法,阻塞等待最后一个线程执行完毕。这个可以用于应用中发起多个请求同时执行的需求。
除了CountDownLatch,还有CycliBarrier栅栏,栅栏是一个比CountDownLatch更进一步的线程控制方案,在指定线程数量执行到一定数量的时候,才能进行下一步。就好比,老师布置了作业,接着大家就开始做,做完的就交作业,老师等到了最后一个交作业的同学交上来,然后老师拿着全部写好的作业又分了下去给各个同学去改,全部改完了大家又交了上来,老师收齐了所有的作业后,可以翻一下试卷找找最高分什么的,然后又让同学们给发下去,最后一张试卷发完,事情就结束了。
另外一些高级工具像信号量Semaphore和Phaser移相器,感觉Semaphore和线程池类似,Phaser和栅栏也类似。
线程池?可以说说为什么要用线程池吗?使用池化技术,它是有好处的!第一个减少创建和销毁线程的开销,利于复用,第二个任务不用等创建线程就可以运行,第三个就是可以管理、调优和监控线程的运行。这里很有必要提一下线程池的运用,Java提供四种内置的创建线程池的方法,虽然都被阿里规范认为不要用为好,避免OOM。有newFixedThreadExecutor,但有等待队列过大造成OOM的可能、ScheduleThreadExecutor、newSingleThreadExecutor,newCacheThreadExecutor,有创建线程过大导致OOM风险。这个时候只能上自定义的线程池了,自定义线程池通过ThreadPoolExecutor创建,参数包括核心线程数、最大线程数、销毁核心线程数之外的线程的等待时间、等待队列、线程工厂、拒绝策略。其中拒绝策略又包括直接抛异常,抛弃最老的,直接丢弃,由调用者自己执行。
线程池可以执行实现了Runable和Callable接口的线程,不需要返回结果的时候使用execute方法,需要返回结果的时候执行submit方法,返回结果要与Future结合使用,用get得到执行结果的时候,会阻塞线程直到执行完成。
补充:
谈一下Java的异常?它们都是Throwable的子类,Error基本就是程序挂掉了,得人工介入排查。Exception也分运行时和非运行时异常,非运行时异常需要catch处理,例如IO操作。运行时异常,例如下标越界,空指针,类不存在,方法不存在,数字格式异常。
第一版Java面试知识点汇总下载(有不少错别字和没更新的):https://pan.baidu.com/s/1MxKXIZtoBd57pTwTIDyrgA 提取码: 3arb。
相关阅读:
飞越面试官(二)--JUC的更多相关文章
- 飞越面试官(三)--JVM
大家好!我是本公众号唯一官方指定没头屑的小便--怕屁林. JVM,全称Java Virtual Machine,作为执行Java程序的容器,几乎代理了Java内存与服务器内存的交互,可以说是程序拥 ...
- 飞越面试官(一)--Java基础
大家好!我是本公众号唯一官方指定没头屑的小便--怕屁林. 众所周知,现场面试(包括视频面试)多数时候是没有白板,也就是说,对于你的知识点.项目经验.过往经历和个人介绍等等,都是靠一张嘴.所以考虑到这个 ...
- 一个HashMap能跟面试官扯上半个小时
一个HashMap能跟面试官扯上半个小时 <安琪拉与面试官二三事>系列文章 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 一个volatile ...
- JVM工作原理和特点(一些二逼的逼神面试官会问的问题)
作为一种阅读的方式了解下jvm的工作原理 ps:(一些二逼的逼神面试官会问的问题) JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完毕,通过以下4步来完毕JVM环境. ...
- 阿里二面,面试官居然把 TCP 三次握手问的这么细致
TCP 的三次握手和四次挥手,可以说是老生常谈的经典问题了,通常也作为各大公司常见的面试考题,具有一定的水平区分度.看似是简单的面试问题,如果你的回答不符合面试官期待的水准,有可能就直接凉凉了. 本文 ...
- 反制面试官 | 14张原理图 | 再也不怕被问 volatile!
反制面试官 | 14张原理图 | 再也不怕被问 volatile! 悟空 爱学习的程序猿,自主开发了Java学习平台.PMP刷题小程序.目前主修Java.多线程.SpringBoot.SpringCl ...
- [Java面经] 关于面试的二三事.
今天终于闲下来了, 那么也好总结下这几天面试的经历.四天的时间一共面了七家, 有一家是自己推迟了没有去.声明:如若转载请注明出处:http://www.cnblogs.com/wang-meng/p/ ...
- 面试官的七种武器:Java篇
起源 自己经历过的面试也不少了,互联网的.外企的,都有.总结一下这些面试的经验,发现面试官问的问题其实不外乎几个大类,玩不出太多新鲜玩意的.细细想来,面试官拥有以下七种武器.恰似古龙先生笔下的武侠世界 ...
- Android开发面试经——5.常见面试官提问Android题①
版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客: http://blog.csdn.net/f ...
随机推荐
- Java实现 蓝桥杯VIP 算法训练 统计单词个数
题目描述 给出一个长度不超过200的由小写英文字母组 成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份 (1< k< =40),且每份中 ...
- Java实现 蓝桥杯VIP 算法训练 会议中心
算法训练 会议中心 时间限制:2.0s 内存限制:512.0MB 会议中心 Siruseri政府建造了一座新的会议中心.许多公司对租借会议中心的会堂很感兴趣,他们希望能够在里面举行会议. 对于一个客户 ...
- Java实现 LeetCode 206 反转链表
206. 反转链表 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL ...
- Java实现 LeetCode 124 二叉树中的最大路径和
124. 二叉树中的最大路径和 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: ...
- 第五届蓝桥杯JavaC组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.猜年龄 题目描述 小明带两个妹妹参加元宵灯会.别人问她们多大了,她们调皮地说:"我们俩的年龄之积是年龄之和的6倍" ...
- Java实现第九届蓝桥杯测试次数
测试次数 题目描述 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后 ...
- 全网最全postman接口测试教程和接口项目实战~从入门到精通!!!
Postman实现接口测试内容大纲一览: 一.什么是接口?为什么需要接口? 接口指的是实体或者软件提供给外界的一种服务. 因为接口能使我们的实体或者软件的内部数据能够被外部进行修改.从而使得内 ...
- install-package : 由于无法加载项目 mydemo 的详细信息,操作失败
安装nuget package包提示错误 install-package : 由于无法加载项目 mydemo 的详细信息,操作失败 解决方法 项目用dotnet cli 命令dotnet new mv ...
- 20184302 2019-2020-2 《Python程序设计》实验四报告
20184302 2019-2020-2 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 1843 姓名: 李新锐 学号:184302 实验教师:王 ...
- 一次性搞懂 PHP 中面向对象的所有知识点。
OOP是什么? OOP是面向对象编程,面向对象编程是一种计算机编程架构. OOP的基本原则是计算机程序是由单个能起到子程序作用的单元或对象组合而成. 基本概念: 类:定义了事务的抽象特点.包含了数据的 ...