其实之前一直想专门写一篇,单独说一说Java的多线程与高并发,但是一直以来,都没有想到能够用什么比较有趣的表现形式去表达出来,而且网上充斥着很多类似的博客,有好的又不好的,有简介的有繁琐的,所以也一直没写。
但是想了想既然之前有这个想法,而且也已经好久没有写过博客了,索性还是写一写,尽量写的有意思一点。
另:之前的高并发&性能优化没有来得及往下写,实在是因为里面的东西太过于复杂,且最近正好换了工作,确实没有那么多时间去研究,现在写东西还是希望能多写点有用的,而不是书本照搬当笔记用,当然能力有限,写烂了,大家谅解一二,略过不看即可。
当然第一篇,我们依旧从概念开始,所以第一部分仍是概念。
【并发与并行】
从题目名词开始讲。
并发
并发,顾名思义,一起出发;
在你吃饭的时候,来了一个电话,如果你可以先接电话,然后再继续把饭吃完,这个叫并发;
但是如果你只能等饭吃完才可以去接电话,叫非并发(串行)。
所以,并发指的是处理多任务的能力,当你只能一件事情一件事情串行执行任务的时候,就是不支持并发的,当你可以多件事情一起执行的时候(轮替或者其他方式),就是支持并发的。
并行
还是举上面那个例子,当你吃饭的时候,来了一个电话,你边吃饭边接电话,这叫并行;
并行指的就是同时运行;支持并行的基础就是多线程。
【同步和异步】
同步和异步的概念一般用于方法。
同步
当一个方法开始执行,必须等这个方法执行结束,才可以往下执行,我们叫做同步。
同步主要用于上下有递进关系的代码,特点是有序,串行执行,逻辑简单,但是执行效率较低。
异步
当一个方法开始执行,我们不必等这个方法执行结束,直接执行后面的内容,我们叫做异步。
(可以认为只是进行了一个消息的传递,调用后会立即返回)
异步在java里面主要使用线程(包括一些封装类也是如此)实现,特点是执行效率高,但是逻辑相对复杂,容易出问题。
【什么是高并发】
有果必有因,通俗来讲,多线程可以认为是高并发的一种表现形式或者解决方案,所以在讲多线程之前,我们先讲高并发。
高并发,指的是一个系统,在短时间内,收到大量操作请求的情况。
这种情况,一般而言主要发生在web系统中,比如:京东双十一,微博明星传出绯闻,12306春运抢票等等。
很容易理解的东西我们不过多的作诠释,以下几项,是高并发的常用指标:
响应时间(Response Time)
系统对请求作出的响应时间(一个请求从请求发出到请求结束的时间)
吞吐量(Throughput)
单位时间内处理的请求数量
每秒查询率QPS(Query Per Second)
每秒响应请求数。(其实与吞吐量指向同一个指标)
并发用户数
同时承载正常使用系统功能的用户数量。
这里需要注意的是,我们经常会将高并发和多线程放在一起讲,但是他们之间并不能划等号,多线程只是高并发在应用代码层面的一种解决方案,然而一般情况下,高并发还需要系统架构,硬件设施,网络等多方面的调优协助完成。
【雪崩效应】
雪崩效应,原本出现在密码学中,后来引申入高并发场景的一个概念。
在密码学中,雪崩效应(Avalanche effect)指加密算法(尤其是块密码和加密散列函数)的一种理想属性。