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

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实现 蓝桥杯VIP 算法训练 调和数列

    问题描述 输入一个实数x,求最小的n使得,1/2+1/3+1/4+-+1/(n+1)>=x. 输入的实数x保证大于等于0.01,小于等于5.20,并且恰好有两位小数.你的程序要能够处理多组数据, ...

  2. Arrays.binarySearch和Collections.binarySearch的详细用法

    概述 binarysearch为在指定数组中查找指定值得索引值,该值在范围内找得到则返回该值的索引值,找不到则返回该值的插入位置,如果该值大于指定范围最大值则返回-(maxlength+1),而: i ...

  3. Java实现 洛谷 P2024 [NOI2001]食物链

    输入输出样例 输入 #1 100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5 输出 #1 3 import java.util.Scanner; pub ...

  4. java实现股票的风险

    股票的风险 股票风险 股票交易上的投机行为往往十分危险.假设某股票行为十分怪异,每天不是涨停(上涨10%)就是跌停(下跌10%).假设上涨和下跌的概率均等(都是50%).再假设交易过程没有任何手续费. ...

  5. java实现第五届蓝桥杯信号匹配

    信号匹配 从X星球接收了一个数字信号序列. 现有一个已知的样板序列.需要在信号序列中查找它首次出现的位置.这类似于串的匹配操作. 如果信号序列较长,样板序列中重复数字较多,就应当注意比较的策略了.可以 ...

  6. EasyARM-iMX257如何配置出低速率CAN

    EasyARM-iMX257如何配置出低速率CAN 在EasyARM-iMX257 Linux开发指南 V1.02.01"5.6 socket CAN编程socket CAN编程" ...

  7. 【1】svn 指令总结

    [1]svn log 1.svn log 2. [2]svn di [3]

  8. DES/3DES/AES 三种对称加密算法实现

    1. 简单介绍 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES ...

  9. Nginx源码编译安装选项

    [Nginx源码编译过程] make是用来编译的,它从Makefile中读取指令,然后编译. make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置. configu ...

  10. phpstorm里面无法配置deployment?

    我的preference里面找不到deployment是什么回事啊? 解决方案: 导致这个问题的原因是PHPStorm的plugins里面没有Remote Hosts Access这个插件,安装一下这 ...