飞越面试官(二)--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。

相关阅读:

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容

  • 下面最近发的一些并发编程的文章汇总,通过阅读这些文章大家再看大厂面试中的并发编程问题就没有那么头疼了。今天给大家总...
    架构师springboot阅读 682评论 0 3
  • 前言 这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。 这些多线程的问题,有些来源于各大网站...
    java成功之路阅读 831评论 0 9
  • 前言 个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。这篇文章主要...
    尧淳阅读 677评论 0 17
  • 前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需...
    jackcooper阅读 643评论 1 16
  • 过几天就要报名教师资格证考试,是时候准备看书备战国考噜... 可是我竟然方了 从哪里开始看啊 加油啊!想想每年都会...
    大风小雨阅读 321评论 0 0