并发编程的艺术
并发能显著提高应用的吞吐量,并发编程是进行基础组件、中间件研发不可或缺的一项技能。并发编程的艺术在于设计多个解决问题域的参与者,协调他们的行为(临界资源的访问)进行高效的协作。
有些语言通过库来支持,如java.util.concurrent包,有些提供语法层面的特性支持,如goroutine的channel。各种不同的方式对并发编程不断的探索,提出解决方案,感叹其编程艺术的美
现代化的编程世界,谁能更优雅的提供更优雅地并发编程设计,谁就能更易于获得工程师的青睐, 就更快的实现出伟大的作品,进而相互背书,这个故事发生了一次又一次,离2018年最近的一次应该属docker、k8s之于golang了。
JVM也因为拥有良好的并发编程设计使其一直雄踞企业级开发, 只可惜国内基本上都是把JVM等价于java来对待,而JVM的生态具有居多的方言,如groovy, scala, clojure,每一个都有拿出响当当的作品, 如gradle,spark等。在企业开发的经济效率的考量下,kotlin与java结合的最为紧密些, 能更好的复用你在java的投资和使用JVM平台优秀的作品
如今技术进入云时代,并发编程的艺术变得越来越大放异彩,流编程(stream)、响应式编程(Reactive Programming)更多的出现在程序员的视野,让我们期待更优雅的并发编程的艺术创作吧。
这里分析一下java.util.concurrent包对并发编程艺术的追求,java确实有些啰嗦,容易掩盖编程的艺术, 用kotlin来窥探一下java.util.concurrent的并发编程的艺术吧
- CountDownLatch 倒计时阀门 等待指定数量的事件发生后继续运行
- CyclicBarrier 循环屏障 等待多个线程都到达预定点时一起并发执行
- Exchanger 交换器 一个线程等待与另一个线程同时进行交换
- ForkJoinPool 分而治之 大任务拆分成子任务并行的处理然后把结果合并起来
- ReentrantLock 可重入锁 实现synchronized的语义,可设置条件,拥有更好的灵活性
- Semaphore 信号量 通过计数器控制对共享资源的访问
- Phaser 相位调节器 可定义多个阶段的同步
- Future 异步获取结果
- Atomic 线程安全的原子操作
现实生活中有很多的并发问题(死锁、活锁、吞吐量下降等),对并发场景做个抽象,常见的并发模型有:
- 生产者-消费者 生产者和消费者对缓冲区互斥访问,生产者和消费者相互依赖协作
- 读者-写者 读者和写者是互斥,写者和写者也互斥,而读者和读者可并发访问
- 哲学家进餐 5名哲学家与左右邻居对其中间筷子的访问是互斥关系
- 吸烟者 供应者与三个抽烟者分别是同步关系,三个抽烟者对抽烟这个动作互斥关系
现实中其他的并发问题基本上都可以抽象为这几种模型来看待
-以上-
链接: