并发编程的核心
我们先来看下并发编程的三大核心知识图。
核心问题
要想学好并发编程,首先要理解三个核心的问题:分工,同步和协作(《【高并发】要想学好并发编程,关键是要理解这三个核心问题》)。
诡异的问题
并发编程并不像普通业务中的CRUD那么简单,往往在并发编程中会出现各种各样诡异的Bug问题(《【高并发】导致并发编程频繁出问题的“幕后黑手”》),而且这些问题也不好复现。究其根本原因,是操作系统的CPU与内存和I/O存在速度差异,而操作系统和编译器在解决这些速度差异带来的问题时,又引入了可见性(《【高并发】解密导致诡异并发问题的第一个幕后黑手——可见性问题》)、原子性(《【高并发】解密导致并发问题的第二个幕后黑手——原子性问题》)、有序性(《【高并发】解密导致并发问题的第三个幕后黑手——有序性问题》)问题,而这三个核心问题,就是导致并发编程出现各种诡异Bug的根本所在。
如何解决问题
在Java中,如何解决并发编程中的可见性、原子性和有序性问题呢?在Java中提供了内存模型和互斥锁的方案来解决这些问题。在Java的内存模型中,有一个很重要的原则,那就是:Happens-Before原则(《何为Happens-Before原则?这次彻底懂了!》)。通过Java的内存模型,能够解决可见性和有序性问题(《【高并发】如何解决可见性和有序性问题?这次彻底懂了!》),对于如何解决原子性问题,我们使用的是互斥锁方案(《【高并发】如何使用互斥锁解决多线程的原子性问题?这次终于明白了!》)。
互斥锁带来的问题
互斥锁在是解决并发问题的核心方案,但是一不留神就会引起死锁(《【高并发】高并发环境下诡异的加锁问题(你加的锁未必安全)》、《【高并发】优化加锁方式时竟然死锁了!!》)
优化加锁方式
既然互斥锁会带来死锁的问题,那我们如何优化加锁的方式呢?(《【高并发】高并发场景下如何优化加锁方式?看完这篇我确实明白了!!》)
线程知识
线程的生命周期(《【高并发】线程的生命周期其实没有我们想象的那么简单!!》)、高并发场景下我们到底创建多少线程合适(《【高并发】高并发场景下创建多少线程才合适?一条公式帮你搞定!!》)?为什么局部变量就是线程安全的(《【高并发】终于弄懂为什么局部变量是线程安全的了!!》)?为什么很多小伙伴面试会栽在InterruptedException上(《【高并发】由InterruptedException异常引发的思考》)?我可以用Java中的面向对象的思想写好并发程序,你信吗(《【高并发】信不信?以面向对象的思想是可以写好高并发程序的!》)?
核心案例
秒杀系统架构解密(《【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!》)
分布式锁架构解密(《【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!》)
分布式限流理论(《【高并发】如何实现亿级流量下的分布式限流?这些理论你必须掌握!!》)
分布式限流算法(《【高并发】如何实现亿级流量下的分布式限流?这些算法你必须掌握!!》)
实现HTTP接口限流(《【高并发】亿级流量场景下如何为HTTP接口限流?看完我懂了!!》)
实现分布式限流(《【高并发】亿级流量场景下如何实现分布式限流?看完我彻底懂了!!》)
更多内容
有关更多并发编程的知识,小伙伴们可以到【高并发专题】进行系统学习。
好了,今天就到这儿吧,我是冰河,我们下期见!