Java 并发编程总结与学习资源推荐

2020-01-07   阅读(152)  

还记得在我刚入门 Java 时,涉及到多线程和异步的时候,不知道需要怎么编码才能达到期望的运行结果。

 

早期开发中,数据库、框架、中间件已经帮我们处理好了并发相关的问题;但在高并发的业务系统中,单个数据库和中间件能承受的并发量可能就是系统的瓶颈,如何扛住业务系统的大并发成了自己要处理的问题。

 

只要需要自己来处理的地方,总会搞出 bug,诡异的出现又诡异的消失。这些问题困扰了我很久,所以第一个想重新系统地学习的知识模块就是 Java 并发编程。

 

我的学习思路是这样的:

首先了解并发编程所涉及的概念(是什么)

  • 什么是并发编程呢?什么是并行?两者的区别?
  • 多 CPU、CPU 多核对并行与并发的影响?什么是进程、线程、协程、线程池?
  • 什么是内核线程、用户线程、守护线程?
  • 什么是线程安全、可见性、原子性、有序性?
  • 什么是锁、可重入锁、读写锁、乐观锁、悲观锁、锁升级?
  • 什么是死锁、活锁、饥饿?发生条件是什么?
  • 什么是内存模型、happens-before 原则?
  • 什么是信号量?volatile、synchronized 关键字的作用是什么?
  • 有哪些解决并发问题的通用模型?

......

 

其次是在什么场景下需要使用并发编程,它到底可以解决什么问题(使用场景)

  • 使用无锁技术,提高性能
  • 使用线程等待与唤醒,提高性能,减少对 CPU 的占用
  • 使用线程池,减少线程频繁创建和销毁给系统带来的开销
  • 使用异步编程,提高系统的吞吐量
  • 任务的同步转异步,异步转同步
  • 将任务分解,提高性能
  • 使用守护线程,监听任务执行情况,出现进行处理
  • 启动新的线程,提高程序的响应速度,让任务在后台执行
  • 使用读写锁提高读多写少场景下的性能

......

 

第三如何处理并发类问题(怎么做)

  • 如何创建、启动和停止线程与线程池?
  • 如何正确地配置各类池化技术的线程连接数?
  • 如何加锁解决资源共享与竞争的问题?
  • 如何避免死锁、活锁与饥饿的问题?
  • 如何控制线程的等待与唤醒?
  • 无锁工具类:原子类、线程本地存储、copy-on-write 类、并发容器在什么场景下、如何使用?
  • 各种类型的锁:乐观锁、悲观锁、自旋锁、读写锁、公平锁、非公平锁等。如何在合适的场景下使用?
  • 如何使用信号量来进行并发控制?
  • 如何用并发工具类完成线程间的任务分工、同步与协作?

 

最后,优质的学习资源推荐(提升)

书籍:

  • 《Java并发编程实战》
  • 《Java并发编程:设计原则与模式》
  • 《Java并发编程的艺术》
  • 《Java并发编程之美》

 

站点:

原文:http://tutorials.jenkov.com/java-util-concurrent/index.html

译文:https://blog.csdn.net/defonds/article/details/44021605

 

 

注:

《Java并发编程实战》、《Java并发编程:设计原则与模式》这两本书,有能力可以看英文版,作者都包含并发大师 Doug Lea,JDK 并发工具包 java.util.concurrent 的作者。

 

 

终于,把并发编程系统地过了一遍,也算是了了自己的一个心愿。

 

下一站,spring。

 

ConstXiong 备案号:苏ICP备16009629号-3