引言
众所周知,软件系统有三高:**高并发、高性能、高可用。**三者既有区别也有联系,门门道道很多,全面讨论可以大战三天三夜。
高并发对于Java开发者来说都不陌生,每年天猫双十一,秒杀大促等场景阿里都稳稳的扛住了如此大的并发量,因此说,阿里在这方面也有绝对的话语权。
可以从阿里等其他互联网大厂的招聘要求上看到,有高并发开发经验优先考虑。因此,Java并发问题一直是各个大厂面试的重点之一。很多程序员每天忙着搬砖,平时接触不到高并发,哪天受不了跑去面试,还常常会被面试官犀利的高并发问题直接KO。
我们都知道高并发的基础是并发编程,而阿里新推出的这份《新高并发宝典》层层深入,形成了一个很好的知识系统,让你在应对面试官的时候完全不慌,所以今天我们就一起来学习一下阿里的高并发架构吧。
并发模型和分布式系统很相似
并发模型其实和分布式系统模型非常相似,在并发模型中是线程
彼此进行通信,而在分布式系统模型中是 进程
彼此进行通信。然而本质上,进程和线程也非常相似。这也就是为什么并发模型和分布式模型非常相似的原因。
分布式系统通常要比并发系统面临更多的挑战和问题比如进程通信、网络可能出现异常,或者远程机器挂掉等等。但是一个并发模型同样面临着比如 CPU 故障、网卡出现问题、硬盘出现问题等。
因为并发模型和分布式模型很相似,因此他们可以相互借鉴,例如用于线程分配的模型就类似于分布式系统环境中的负载均衡模型。
其实说白了,分布式模型的思想就是借鉴并发模型的基础上推演发展来的。
认识两个状态
并发模型的一个重要的方面是,线程是否应该共享状态
,是具有共享状态
还是独立状态
。共享状态也就意味着在不同线程之间共享某些状态
状态其实就是数据
,比如一个或者多个对象。当线程要共享数据时,就会造成 竞态条件
或者 死锁
等问题。当然,这些问题只是可能会出现,具体实现方式取决于你是否安全的使用和访问共享对象。
独立的状态表明状态不会在多个线程之间共享,如果线程之间需要通信的话,他们可以访问不可变的对象来实现,这是一种最有效的避免并发问题的一种方式,如下图所示
使用独立状态让我们的设计更加简单,因为只有一个线程能够访问对象,即使交换对象,也是不可变的对象。
并发模型
并行 Worker
第一个并发模型是并行 worker 模型,客