第1章 并发编程的挑战

前言

近日补充学习了《Java并发编程艺术》这本书,精读后自己做出总结,把书读薄,能加深印象。

本章主要讲解了Java并发编程需要面对和解决的挑战:上下文切换的消耗,死锁 以及 资源的限制

第1章 并发编程的挑战

并发编程以后多种挑战需要面临:例如上下文切换问题、死锁问题、受限于硬件/软件资源限制的问题

一、上下文切换

  • 过多的上下文切换会影响效率。
  • 在较少数量级的运算中,因为线程的创建以及上下文切换,可能导致并行比串行执行还慢。

减少上下文切换的方法:

  1. 无锁并发编程:(多线程竞争锁的时候会导致上下文切换)采用一些方法避免使用锁,比如:用hash算法将数据ID取模分段,然后不同线程处理不同段的数据
  2. CAS算法:Java的Atomic包使用CAS算法更新数据,不需要加锁
  3. 使用最少线程避免创建不需要的线程(过多线程的等待状态会导致上下文切换增加)(换言之要减少等待状态的线程)
  4. 协程在单线程内实现多任务调度,并在单线程内维持多任务切换。

二、死锁

避免死锁的几种常见方法

  • 避免一个线程同时获得多个锁
  • 避免一个线程在锁内同时占用多个资源,尽量保证每个所只占用一个资源
  • 尝试使用定时锁(用lock.tryLock(timeout) 来替代内部锁机制)
  • 数据库锁的加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

三、资源限制

  • 资源限制分为软件资源(数据库连接数,socket连接数等)和硬件资源(CPU处理速度,硬盘读写速度等)的限制
  • 资源限制导致的问题:有时候受限于资源,导致程序仍然在串行执行,加上上下文切换和资源调度,会更慢
  • 解决资源限制的问题:集群并行执行(多机运行程序(不同机器处理不同数据))(也就是加服务器)
  • 在资源限制的情况下并发编程:需要根据不同的资源限制调整程序的并发度

本文标题:第1章 并发编程的挑战

文章作者:Aaron.H

发布时间:2018年04月27日 - 20:04

最后更新:2018年09月10日 - 17:09

原始链接:https://uncleaaron.github.io/Blog/Java/Java并发编程艺术/第1章-并发编程的挑战/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。