并发编程的艺术

  并发能显著提高应用的吞吐量,并发编程是进行基础组件、中间件研发不可或缺的一项技能。并发编程的艺术在于设计多个解决问题域的参与者,协调他们的行为(临界资源的访问)进行高效的协作。

  有些语言通过库来支持,如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的并发编程的艺术吧

  1. CountDownLatch 倒计时阀门 等待指定数量的事件发生后继续运行
  2. CyclicBarrier 循环屏障 等待多个线程都到达预定点时一起并发执行
  3. Exchanger 交换器 一个线程等待与另一个线程同时进行交换
  4. ForkJoinPool 分而治之 大任务拆分成子任务并行的处理然后把结果合并起来
  5. ReentrantLock 可重入锁 实现synchronized的语义,可设置条件,拥有更好的灵活性
  6. Semaphore 信号量 通过计数器控制对共享资源的访问
  7. Phaser 相位调节器 可定义多个阶段的同步
  8. Future 异步获取结果
  9. Atomic 线程安全的原子操作

  现实生活中有很多的并发问题(死锁、活锁、吞吐量下降等),对并发场景做个抽象,常见的并发模型有:

  1. 生产者-消费者 生产者和消费者对缓冲区互斥访问,生产者和消费者相互依赖协作
  2. 读者-写者 读者和写者是互斥,写者和写者也互斥,而读者和读者可并发访问
  3. 哲学家进餐 5名哲学家与左右邻居对其中间筷子的访问是互斥关系
  4. 吸烟者 供应者与三个抽烟者分别是同步关系,三个抽烟者对抽烟这个动作互斥关系

现实中其他的并发问题基本上都可以抽象为这几种模型来看待

-以上-

链接:

art@知乎专栏

art@gitbook

art@github

results matching ""

    No results matching ""