多线程的理解
什么是多线程
如果一个程序允许两个或者两个以上的线程,那么它便是多线程程序。多线程是指单个进程内允许多个线程。
任务分为资源独立任务和资源共享任务。独立任务不需要使用多线程;共享任务,会使用到进程共享资源,需要保证线程安全。
场景理解:房子与租客
假设有一套房子,住着我和我的几个室友,房子比喻进程,我和室友比喻线程。房子中有很多公共空间,例如厨房、客厅,每个人都可以到客厅来。厨房和客厅比喻进程内存空间,其对每个线程都是敞开的,每个线程都可以从进程中获取资源,并相互之间通信。
假设房子里面只有一个厕所,当室友A进入厕所,就会占用厕所并上锁,其他人想要使用厕所就只能等待A打开锁出来。此处解释锁的概念。
每个人都有一个独立的房间。房间用来比喻线程拥有的独立资源,每个线程都有自己的ID、堆栈,线程之间资源独立,互不影响。
假设要对客厅与厨房进行卫生打扫工作,我一个人打扫的话,工作量会比较大;我和室友一起打扫,工作时间减半。此处比喻多线程的并发与并行。
为什么需要多线程
最主要的目的就是提高CPU利用率
对于当前四核、六核CPU,仅使用单线程会浪费绝大多数的CPU资源,多线程可以充分发挥多核CPU运行效率。
主要体现在三个方面:(1)提高处理速度;(2)避免无效等待(IO的时候可以做其他事情);(3)提高用户体验:避免卡顿、缩短等待时间。以Tomcat服务器为例,其用多个线程接收HTTP请求,而不是排队等待单一的线程处理。
便于编程建模
有了多线程,我们可以将任务分为多个模块由多个线程执行。
计算机性能定律:摩尔定律失效,阿姆达尔定律登上舞台
摩尔定律:集成电路上可容纳的晶体管数目每隔18个月增加一倍,性能相应增加一倍。由于物理限制,晶体管数量无法继续保持指数级增长。摩尔定律失效。
阿姆达尔定律:处理器越多,程序执行就越快,但是有上限。上限取决于程序中串行部分的比例,并行的比例越高,多处理器的效果越明显。
++总结:CPU能力提升速度放缓,就要求我们提高程序中可并行部分并行化,提高程序性能。++
多线程使用场景与局限性
什么场景需要多线程
- 提高工作效率和处理能力,例如Tomcat、NIO、并行下载
- 同时处理多件事情时,例如后台定时任务
- 需要同时有很大并发量的时候,例如压测。
局限性
- 性能问题:上下文切换带来的消耗
- 异构化任务(任务结构不一样)很难高效并行
- 线程安全问题:包括数据安全问题(例如i++导致数据不一致)以及线程带来的活跃性问题(线程饥饿、线程死锁)。
在单核CPU上运行多线程程序有意义吗?
有意义。
首先,我们编写多线程程序是出于多核CPU考虑的,即使我们事先并不知道我们的程序是在单核还是多核CPU上运行。其次,假设单核CPU上只允许单线程,如果程序执行缓慢(例如磁盘整理),会影响到其他任务的运行。多线程则仍能保证其他任务得到运行。
高并发的理解
高并发通常是指同一时刻发起大量请求到服务器,服务器并行处理请求,例如双十一、12306抢火车票。
高并发与多线程的联系与不同
高并发是一种状态,表现为用户集中来访问服务器。
多线程是高并发的其中一种解决方案。(1)可以用来解决高并发带来的线程安全问题;(2)提高硬件的利用率,例如Tomcat服务的多线程处理请求模式。
然而,高并发并不意味着就是多线程,例如Redis底层就是单线程。针对于数据库高并发场景,可以不采用多线程,而是添加Redis缓存数据层,Redis不会有线程安全问题,会存在缓存数据不一致的问题。
高并发的指标
- QPS:每秒钟的请求数
- 带宽
- PV(page view):通常指24小时的页面访问量。
- UV(unique visitor):PV基础上,针对访客的去重。
- IP
- 并发连接数:某个时刻并发请求的数目,通常大于用户数。
- 服务器平均请求等待时间:服务器处理一个请求所需的时间。
如果两次登录IP发生改变,如果cookie没有改变,则IP加1,UV不变;对于局域网内,对外IP只有一个,服务器校验两次请求的cookie不同,UV加1。
转载:https://blog.csdn.net/LIZHONGPING00/article/details/103776686