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

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 算法训练 链表数据求和操作

    算法训练 9-7链表数据求和操作 时间限制:1.0s 内存限制:512.0MB 读入10个复数,建立对应链表,然后求所有复数的和. 样例输入 1 2 1 3 4 5 2 3 3 1 2 1 4 2 2 ...

  2. Java实现 LeetCode 382 链表随机节点

    382. 链表随机节点 给定一个单链表,随机选择链表的一个节点,并返回相应的节点值.保证每个节点被选的概率一样. 进阶: 如果链表十分大且长度未知,如何解决这个问题?你能否使用常数级空间复杂度实现? ...

  3. Java实现 LeetCode 380 常数时间插入、删除和获取随机元素

    380. 常数时间插入.删除和获取随机元素 设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构. insert(val):当元素 val 不存在时,向集合中插入该项. remove( ...

  4. 第七届蓝桥杯JavaA组国(决)赛部分真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.阶乘位数 阶乘位数 9的阶乘等于:362880 它的二进制表示为:1011000100110000000 这个数字共有19位. 请你计 ...

  5. Linux的文件系统及文件缓存知识点整理

    Linux的文件系统 文件系统的特点 文件系统要有严格的组织形式,使得文件能够以块为单位进行存储. 文件系统中也要有索引区,用来方便查找一个文件分成的多个块都存放在了什么位置. 如果文件系统中有的文件 ...

  6. 第一章01-正常情况下Activity的生命周期

    一.Android下能见到的界面 Window Dialog Toast Activity 二.Activity的生命周期分析 典型情况下的生命周期 ​是指在有用户参与的情况下,Activity所经过 ...

  7. Elasticsearch 常见错误

    一 read_only_allow_delete" : "true" 当我们在向某个索引添加一条数据的时候,可能(极少情况)会碰到下面的报错: { "error ...

  8. Centos 7 k8s Deployment新副本控制器

    一.概念 Kubernetes提供了一种更加简单的更新RC和Pod的机制,叫做Deployment.通过在Deployment中描述你所期望的集群状态,Deployment Controller会将在 ...

  9. jQuery - Ajax ajax方法详解

    $.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Strin ...

  10. (八)利用 Profile 构建不同环境的部署包

    接上回继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5种环境:本机环境(local).(开发小组内自测的)开发环境(dev).(提供给测试团队的)测试环境(test).预发布环境(pre) ...