目录
高并发编程是什么?
高并发编程指的是在面对大量并发请求时,为了保证系统的性能和处理能力,采用相应的编程技术和策略来处理并发任务。在高并发场景中,系统需要同时处理大量的请求,因此需要考虑如何有效地利用计算资源、提高系统的吞吐量(是指系统在单位时间内能够处理的工作量)和响应速度。多线程是实现高并发编程的一种常见技术和手段。
意义:
- 充分利用CPU的资源。当我们有8个cpu,就可以同时开启8个线程,如果我们写的程序是单线程的,那么另外7个cpu是不是就闲着没事做了。所以我们只有写了多线程程序,才能充分的利用cpu的资源。
-
加快响应用户的时间。例如我们现在下载电视剧的时候,是不是不会一集一集的下,而是同时下载3,4集等等,为什么?因为这样速度快嘛。
-
可以使你的代码模块化 , 异步化 , 简单化。例如我们在实现电商系统的时候,用户一旦下单,我们就会去发短信通知用户,那用户关心你这个是怎么发送短信的吗?肯定不关心啊,所以我们就可以将向用户发送短信独立为单独的模块,并交给其它线程去执行,这样既增加了异步操作,提升了系统性能,又使程序模块化、简单化。
注意事项:
- 线程之间的安全性。java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域(看图):
我们都知道一个进程会有多个线程,线程共享区域被所有线程共享,那么是不是就会有这么一个现象——多个线程对同一个内存地址的数据进行操作,如果说只是读取该内存地址存的数据的话,肯定是没有问题的,那如果是修改该内存地址存的数据呢?是不是就会出现问题,例如:有一个全局变量的值为0,A线程需要将该变量改1才能进行后续的工作,当A线程改完之后,B线程这时候也需要修改这个变量,B线程改完之后,A访问时就纳闷了,怎么变量的值不是1了,我不是改成1了吗? - 线程之间的死锁。为了解决线程之间安全问题,java中便引入了锁机制,但是如果使用不当,就会产生死锁。因为不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成。例如:两个人在家里吃牛排,他们必须共享刀叉并轮流吃,他们都需要获得两个锁:共享刀和共享叉的锁,假如线程 A 获得了刀,而线程 B 获得了叉。线程 A 就会进入阻塞状态来等待获得叉,而线程 B 则阻塞来等待线程 A 所拥有的刀,这就是所谓的死锁。
- 线程太多了会将服务器资源耗尽形成死机宕机。线程数太多有可能造成系统创建大量线程而导致消耗完系统内存以及CPU的“过渡切换”,造成系统的死机
- 为什么os限制线程数?因为开启一个线程,线程是需要内存空间的,例如每个线程都会有一个虚拟机栈,如果你开启一个线程,不做事,假设一个线程需要消耗1M内存空间,开启1000个线程就会需要1G。