大家好!我是本号唯一官方指定没头屑的小便--

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。

相关阅读:

飞越面试官(一)--Java基础

重磅!两万字Java面试知识点汇总发布

 

飞越面试官(二)--JUC的更多相关文章

  1. 飞越面试官(三)--JVM

    大家好!我是本公众号唯一官方指定没头屑的小便--怕屁林.   JVM,全称Java Virtual Machine,作为执行Java程序的容器,几乎代理了Java内存与服务器内存的交互,可以说是程序拥 ...

  2. 飞越面试官(一)--Java基础

    大家好!我是本公众号唯一官方指定没头屑的小便--怕屁林. 众所周知,现场面试(包括视频面试)多数时候是没有白板,也就是说,对于你的知识点.项目经验.过往经历和个人介绍等等,都是靠一张嘴.所以考虑到这个 ...

  3. 一个HashMap能跟面试官扯上半个小时

    一个HashMap能跟面试官扯上半个小时 <安琪拉与面试官二三事>系列文章 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 一个volatile ...

  4. JVM工作原理和特点(一些二逼的逼神面试官会问的问题)

    作为一种阅读的方式了解下jvm的工作原理 ps:(一些二逼的逼神面试官会问的问题) JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完毕,通过以下4步来完毕JVM环境. ...

  5. 阿里二面,面试官居然把 TCP 三次握手问的这么细致

    TCP 的三次握手和四次挥手,可以说是老生常谈的经典问题了,通常也作为各大公司常见的面试考题,具有一定的水平区分度.看似是简单的面试问题,如果你的回答不符合面试官期待的水准,有可能就直接凉凉了. 本文 ...

  6. 反制面试官 | 14张原理图 | 再也不怕被问 volatile!

    反制面试官 | 14张原理图 | 再也不怕被问 volatile! 悟空 爱学习的程序猿,自主开发了Java学习平台.PMP刷题小程序.目前主修Java.多线程.SpringBoot.SpringCl ...

  7. [Java面经] 关于面试的二三事.

    今天终于闲下来了, 那么也好总结下这几天面试的经历.四天的时间一共面了七家, 有一家是自己推迟了没有去.声明:如若转载请注明出处:http://www.cnblogs.com/wang-meng/p/ ...

  8. 面试官的七种武器:Java篇

    起源 自己经历过的面试也不少了,互联网的.外企的,都有.总结一下这些面试的经验,发现面试官问的问题其实不外乎几个大类,玩不出太多新鲜玩意的.细细想来,面试官拥有以下七种武器.恰似古龙先生笔下的武侠世界 ...

  9. Android开发面试经——5.常见面试官提问Android题①

    版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客: http://blog.csdn.net/f ...

随机推荐

  1. Java实现 蓝桥杯 图书排列(全排列)

    标题:图书排列 将编号为1~10的10本书排放在书架上,要求编号相邻的书不能放在相邻的位置. 请计算一共有多少种不同的排列方案. 注意,需要提交的是一个整数,不要填写任何多余的内容. 9 9 10 9 ...

  2. Java实现 LeetCode 140 单词拆分 II(二)

    140. 单词拆分 II 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中.返回所有这些可能的句子. 说明: 分 ...

  3. java实现手机尾号评分

    30年的改革开放,给中国带来了翻天覆地的变化.2011全年中国手机产量约为11.72亿部.手机已经成为百姓的基本日用品! 给手机选个好听又好记的号码可能是许多人的心愿.但号源有限,只能辅以有偿选号的方 ...

  4. java实现三进制转十进制

    ** 三进制转十进制** 不同进制的数值间的转换是软件开发中很可能 会遇到的常规问题.下面的代码演示了如何把键盘输入的3 进制数字转换为十进制.试完善之. BufferedReader br = ne ...

  5. zabbix 磁盘分区监控

    系统环境 Zabbix 版本:3.4 操作系统版本:centos7.4 监控分区 / ./boot ./home   先创建监控项的模板 点击创建监控项 名称随意填写,键值的话因为我们监控车的是磁盘剩 ...

  6. IDEA自定义模板

    RT,虽然看起来简单,每当配置新的IDEA 时,又不免度娘,所以整理下 1.类的模板 路径: settings-Editor-File and Code Templates 右侧找到 class 添加 ...

  7. 【华为云技术分享】数据库开发:MySQL Seconds_Behind_Master简要分析

    [摘要]对于mysql主备实例,seconds_behind_master是衡量master与slave之间延时的一个重要参数.通过在slave上执行"show slave status;& ...

  8. Calender类——字段值介绍

    今天,看到有人这样编写代码,有点不明所以: Calendar calendar = Calendar.getInstance(); calendar.get(1): calendar.get(2)+1 ...

  9. Java——八种基本数据类型(常用类)

    装箱和拆箱 装箱:基本数据类型转为包装类 拆箱:包装类转为基本数据类型 jdk1.5(即jdk5.0)之后的版本都提供了自动装箱和自动拆箱功能 基本数据类型的包装类 举两个例子,看一下 public ...

  10. postman发送json数据

    原文链接:https://blog.csdn.net/weixin_33387378/article/details/90721599 1.设置header  Content-Type   appli ...