前言
近日补充学习了《Java并发编程艺术》这本书,精读后自己做出总结,把书读薄,能加深印象。
本章主要讲解了Java并发编程需要面对和解决的挑战:上下文切换的消耗,死锁 以及 资源的限制
第1章 并发编程的挑战
并发编程以后多种挑战需要面临:例如上下文切换问题、死锁问题、受限于硬件/软件资源限制的问题
一、上下文切换
- 过多的上下文切换会影响效率。
- 在较少数量级的运算中,因为线程的创建以及上下文切换,可能导致并行比串行执行还慢。
减少上下文切换的方法:
- 无锁并发编程:(多线程竞争锁的时候会导致上下文切换)采用一些方法避免使用锁,比如:用hash算法将数据ID取模分段,然后不同线程处理不同段的数据
- CAS算法:Java的Atomic包使用CAS算法更新数据,不需要加锁
- 使用最少线程:避免创建不需要的线程(过多线程的等待状态会导致上下文切换增加)(换言之要减少等待状态的线程)
- 协程:在单线程内实现多任务调度,并在单线程内维持多任务切换。
二、死锁
避免死锁的几种常见方法
- 避免一个线程同时获得多个锁
- 避免一个线程在锁内同时占用多个资源,尽量保证每个所只占用一个资源
- 尝试使用定时锁(用lock.tryLock(timeout) 来替代内部锁机制)
- 数据库锁的加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。
三、资源限制
- 资源限制分为软件资源(数据库连接数,socket连接数等)和硬件资源(CPU处理速度,硬盘读写速度等)的限制
- 资源限制导致的问题:有时候受限于资源,导致程序仍然在串行执行,加上上下文切换和资源调度,会更慢
- 解决资源限制的问题:集群并行执行(多机运行程序(不同机器处理不同数据))(也就是加服务器)
- 在资源限制的情况下并发编程:需要根据不同的资源限制调整程序的并发度