Java核心技术面试精讲
杨晓峰
前Oracle首席工程师
立即订阅
43177 人已学习
课程目录
已完结 43 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 以面试题为切入点,有效提升你的Java内功
免费
模块一 Java基础 (14讲)
第1讲 | 谈谈你对Java平台的理解?
第2讲 | Exception和Error有什么区别?
第3讲 | 谈谈final、finally、 finalize有什么不同?
第4讲 | 强引用、软引用、弱引用、幻象引用有什么区别?
第5讲 | String、StringBuffer、StringBuilder有什么区别?
第6讲 | 动态代理是基于什么原理?
第7讲 | int和Integer有什么区别?
第8讲 | 对比Vector、ArrayList、LinkedList有何区别?
第9讲 | 对比Hashtable、HashMap、TreeMap有什么不同?
第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
第11讲 | Java提供了哪些IO方式? NIO如何实现多路复用?
第12讲 | Java有几种文件拷贝方式?哪一种最高效?
第13讲 | 谈谈接口和抽象类有什么区别?
第14讲 | 谈谈你知道的设计模式?
模块二 Java进阶 (16讲)
第15讲 | synchronized和ReentrantLock有什么区别呢?
第16讲 | synchronized底层如何实现?什么是锁的升级、降级?
第17讲 | 一个线程两次调用start()方法会出现什么情况?
第18讲 | 什么情况下Java程序会产生死锁?如何定位、修复?
第19讲 | Java并发包提供了哪些并发工具类?
第20讲 | 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
第21讲 | Java并发类库提供的线程池有哪几种? 分别有什么特点?
第22讲 | AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
第23讲 | 请介绍类加载过程,什么是双亲委派模型?
第24讲 | 有哪些方法可以在运行时动态生成一个Java类?
第25讲 | 谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
第26讲 | 如何监控和诊断JVM堆内和堆外内存使用?
第27讲 | Java常见的垃圾收集器有哪些?
第28讲 | 谈谈你的GC调优思路?
第29讲 | Java内存模型中的happen-before是什么?
第30讲 | Java程序运行在Docker等容器环境有哪些新问题?
模块三 Java安全基础 (2讲)
第31讲 | 你了解Java应用开发中的注入攻击吗?
第32讲 | 如何写出安全的Java代码?
模块四 Java性能基础 (3讲)
第33讲 | 后台服务出现明显“变慢”,谈谈你的诊断思路?
第34讲 | 有人说“Lambda能让Java程序慢30倍”,你怎么看?
第35讲 | JVM优化Java代码时都做了什么?
模块5 Java应用开发扩展 (4讲)
第36讲 | 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
第37讲 | 谈谈Spring Bean的生命周期和作用域?
第38讲 | 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
第39讲 | 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
周末福利 (2讲)
周末福利 | 谈谈我对Java学习和面试的看法
周末福利 | 一份Java工程师必读书单
结束语 (1讲)
结束语 | 技术没有终点
Java核心技术面试精讲
登录|注册

第19讲 | Java并发包提供了哪些并发工具类?

杨晓峰 2018-06-19
通过前面的学习,我们一起回顾了线程、锁等各种并发编程的基本元素,也逐步涉及了 Java 并发包中的部分内容,相信经过前面的热身,我们能够更快地理解 Java 并发包。
今天我要问你的问题是,Java 并发包提供了哪些并发工具类?

典型回答

我们通常所说的并发包也就是 java.util.concurrent 及其子包,集中了 Java 并发的各种基础工具类,具体主要包括几个方面:
提供了比 synchronized 更加高级的各种同步结构,包括 CountDownLatch、CyclicBarrier、Semaphore 等,可以实现更加丰富的多线程操作,比如利用 Semaphore 作为资源控制器,限制同时进行工作的线程数量。
各种线程安全的容器,比如最常见的 ConcurrentHashMap、有序的 ConcurrentSkipListMap,或者通过类似快照机制,实现线程安全的动态数组 CopyOnWriteArrayList 等。
各种并发队列实现,如各种 BlockingQueue 实现,比较典型的 ArrayBlockingQueue、 SynchronousQueue 或针对特定场景的 PriorityBlockingQueue 等。
强大的 Executor 框架,可以创建各种不同类型的线程池,调度任务运行等,绝大部分情况下,不再需要自己从头实现线程池和任务调度器。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java核心技术面试精讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(40)

  • 天秤座的选择
    做android的,一个页面有A,B,C三个网络请求,其中请求C需要请求A和请求B的返回数据作为参数,用过CountdownLatch解决。
    2018-06-20
    1
    34
  • 013
    1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:
    CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;
    而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;
    另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。
    2)Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限。

    作者回复: 不错

    2018-11-29
    33
  • Daydayup
    CountDownLatch最近还真用上了。我的需求是每个对象一个线程,分别在每个线程里计算各自的数据,最终等到所有线程计算完毕,我还需要将每个有共通的对象进行合并,所以用它很合适。

    作者回复: 合适的场景

    2018-06-22
    1
    23
  • Jerry银银
    对于Java 并发包提供了哪些并发工具类,我是这么理解的:
    1. 执行任务,需要对应的执行框架(Executors);
    2. 多个任务被同时执行时,需要协调,这就需要Lock、闭锁、栅栏、信号量、阻塞队列;
    3. Java程序中充满了对象,在并发场景中当然避免不了遇到同种类型的N个对象,而对象需要被存储,这需要高效的线程安全的容器类
    2018-06-20
    14
  • 夏天🔆
    以前使用coutdownlatch进行并发异常的模拟,来修改bug,具体是在发生异常的错误堆栈上进行await,在某些条件处或触发点进行coutdown,来尽可能模拟触发异常时的场景,很多可以必现,修改之后没有问题,才算解决一个并发异常
    2018-06-20
    9
  • xuery
    最近有用到countDownLatch,一个批量更新接口,采用多线程提高处理速度,全部处理完将结果封装返回给app端

    作者回复: 是个应用频率高的同步工具

    2018-10-03
    5
  • 石头狮子
    列举实践中两个应用并发工具的场景:
    1. 请求熔断器,使用 Semaphore 熔断某些请求线程,待系统恢复以后再逐步释放信号量。
    2. Worker 搜索停止标志。使用 countdownlatch 标记 Worker 找到的结果个数,达到结果后其他线程不再继续执行。
    2018-06-20
    5
  • THROW
    ArrayBlockingQueue使用了两个condition来分别控制put和take的阻塞与唤醒,但是我在想好像只用一个condition也可以,因为put和take只会有一个是处于阻塞等待状态。所以设计成两个condition 的原因是什么呢?只是为了提高可读性么?
    2018-06-20
    5
  • 扫地僧的功夫梦
    17讲的问题,留言有点晚,老师可能不会看,想得到老师的回复:调用notify()/notifyAll()方法后线程是处于阻塞状态吧,因为线程还没获取到锁。

    作者回复: 是说调用notify的那个线程的状态吗?
    不是的,这里有很多方面:
    阻塞一般发生在进入同步块儿时;
    notify并不会让出当前的monitor;
    可以用wait释放锁,但是进入waiting状态。

    不建议靠记忆去学习,类似问题我建议思考一下:能不能用一段程序验证,需不需要利用什么工具;别忘了从Javadoc得到初步信息

    授人以渔比提供答案更重要,最好不要你怀疑我这里的每个结论,自己写代码去玩玩

    2018-06-19
    5
  • Phoenix
    经过老师的讲解,我对CountDownLatch的使用场景是这样理解的:
    1:A线程的执行,依赖与B线程或C线程等等其他多个线程任务的执行结果来触发A线程任务执行事件

    作者回复: 不错

    2018-11-11
    4
  • feifei
    我的使用经验,在进行高并发的测试时,我会使用countdownlatch,将所有的工作线程在开始时等待,然后在统一的开始,这样就可以避免创建线程所需的时间开销,更好的模拟高并发
    2018-08-03
    4
  • 如风
    在写爬虫时,使用过 Semaphore ,来控制最多爬同一个域名下的 url 数量。
    2018-06-20
    4
  • 三个石头
    你用的Semaphore第二个例子,构造函数中为啥为0,信号量不是非负整数吗?
    2018-06-19
    4
  • 扫地僧的功夫梦
    谢谢老师的回复,还是notify()/notifyAll()问题,我想说的是被唤醒的线程再重新获取锁之前应该是阻塞状态吧。
    2018-06-20
    3
  • Leiy
    对于CopyOnWriteArrayList,适用于读多写少的场景,这个比较好理解,但是在实际使用时候,读写比占多少时候,可以使用?心里还是没数,这个怎么去衡量?
    2018-06-19
    2
  • QQ怪
    一般用CountDownLatch来提高接口访问速度,不知道这样符不符合规范😂😂😂
    2019-04-01
    1
  • clz1341521
    我的应用场景是异步发送一定数量的http消息,主线程等待 所有发送完毕,获取所有的发送成功数
    2018-08-06
    1
  • xinxin💛
    老师为什么我用ConcurrentHashMap执行remove操作的时候cpu总是跳得很高,hashmap就还好没那么夸张。。现在为了线程安全还是用ConcurrentHashMap,但执行remove操作的线程一多经常就卡死了。

    作者回复: 你是什么版本jdk?

    2018-07-07
    1
  • jacy
    感觉CountDownLatch有点像c++中的条件锁,想问一下老师,可否给点从c++转java的建议。

    作者回复: 这个...经验谈不上,我也没这经验;或者你可以对比二者的区别,加深理解;
    为什么转?希望达到什么目标?

    2018-06-25
    1
  • zjh
    感觉再分布式的情况下,单体应用中需要多个线程并行的情况可能会被分散在多个应用里面,可能很少会用到CountDownLatch和cyclicbarrier,semaphore倒是比较适合用在分布式的场景下,用来做一些限流。

    作者回复: 不错

    2018-06-21
    1
收起评论
40
返回
顶部