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

通过前面的学习,我们一起回顾了线程、锁等各种并发编程的基本元素,也逐步涉及了 Java 并发包中的部分内容,相信经过前面的热身,我们能够更快地理解 Java 并发包。
今天我要问你的问题是,Java 并发包提供了哪些并发工具类?
典型回答
我们通常所说的并发包也就是 java.util.concurrent 及其子包,集中了 Java 并发的各种基础工具类,具体主要包括几个方面:
提供了比 synchronized 更加高级的各种同步结构,包括 CountDownLatch、CyclicBarrier、Semaphore 等,可以实现更加丰富的多线程操作,比如利用 Semaphore 作为资源控制器,限制同时进行工作的线程数量。
各种线程安全的容器,比如最常见的 ConcurrentHashMap、有序的 ConcurrentSkipListMap,或者通过类似快照机制,实现线程安全的动态数组 CopyOnWriteArrayList 等。
各种并发队列实现,如各种 BlockingQueue 实现,比较典型的 ArrayBlockingQueue、 SynchronousQueue 或针对特定场景的 PriorityBlockingQueue 等。
强大的 Executor 框架,可以创建各种不同类型的线程池,调度任务运行等,绝大部分情况下,不再需要自己从头实现线程池和任务调度器。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》,新⼈⾸单¥59
《Java 核心技术面试精讲》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(47)
- 最新
- 精选
- 0131)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同: CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行; 而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行; 另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。 2)Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限。
作者回复: 不错
93 - DaydayupCountDownLatch最近还真用上了。我的需求是每个对象一个线程,分别在每个线程里计算各自的数据,最终等到所有线程计算完毕,我还需要将每个有共通的对象进行合并,所以用它很合适。
作者回复: 合适的场景
642 - 扫地僧的功夫梦17讲的问题,留言有点晚,老师可能不会看,想得到老师的回复:调用notify()/notifyAll()方法后线程是处于阻塞状态吧,因为线程还没获取到锁。
作者回复: 是说调用notify的那个线程的状态吗? 不是的,这里有很多方面: 阻塞一般发生在进入同步块儿时; notify并不会让出当前的monitor; 可以用wait释放锁,但是进入waiting状态。 不建议靠记忆去学习,类似问题我建议思考一下:能不能用一段程序验证,需不需要利用什么工具;别忘了从Javadoc得到初步信息 授人以渔比提供答案更重要,最好不要你怀疑我这里的每个结论,自己写代码去玩玩
415 - 忍者无敌1995最近有用到countDownLatch,一个批量更新接口,采用多线程提高处理速度,全部处理完将结果封装返回给app端
作者回复: 是个应用频率高的同步工具
411 - Phoenix经过老师的讲解,我对CountDownLatch的使用场景是这样理解的: 1:A线程的执行,依赖与B线程或C线程等等其他多个线程任务的执行结果来触发A线程任务执行事件
作者回复: 不错
6 - zjh感觉再分布式的情况下,单体应用中需要多个线程并行的情况可能会被分散在多个应用里面,可能很少会用到CountDownLatch和cyclicbarrier,semaphore倒是比较适合用在分布式的场景下,用来做一些限流。
作者回复: 不错
2 - xinxin💛老师为什么我用ConcurrentHashMap执行remove操作的时候cpu总是跳得很高,hashmap就还好没那么夸张。。现在为了线程安全还是用ConcurrentHashMap,但执行remove操作的线程一多经常就卡死了。
作者回复: 你是什么版本jdk?
1 - jacy感觉CountDownLatch有点像c++中的条件锁,想问一下老师,可否给点从c++转java的建议。
作者回复: 这个...经验谈不上,我也没这经验;或者你可以对比二者的区别,加深理解; 为什么转?希望达到什么目标?
1 - 步*亮SemaphoreWorker类应该为static
作者回复: 哈哈,那不是inner class
- 天秤座的选择做android的,一个页面有A,B,C三个网络请求,其中请求C需要请求A和请求B的返回数据作为参数,用过CountdownLatch解决。653
收起评论