并发与多线程

并发与多线程,第1张

并发与多线程 并发简述

​ Java在设计之初,就是支持多线程的语言。

​ 在Java学习中,我们经常能听到:高并发、多线程这样的词汇。那么,高并发是什么?线程是什么?高并发与线程有什么关系呢?


线程与进程

​ 在oracle的官方文档中,对进程与线程是这样描述的:

​ 翻译过来,就是进程,是通过fork命令创建出来的运行环境,包含了如文件描述符、用户ID等信息,它被设置为运行程序。

​ 线程,是进程上下文中执行的一系列指令。

进程

​ 那么理解下,进程是程序的一次执行。当我们打开某个程序,就会产生一个进程。

​ 打开任务管理器,就可以看到:

​ 那么再理解下,我们下载了一个程序,但是没有打开。这个时候程序只是占用了一定的空间,大部分是磁盘。当我们打开这个程序,它才会耗费一定的CPU、内存等。如果我们的进程占用资源过大,系统为了响应我们的进程,就会造成卡顿。(例如电脑卡了,打开资源管理器,哦吼,某个进程占用CPU99.99999%)

​ 看到过一个很好的比喻:进程是对我们代码的一个实例化。

线程

​ 进程可以看做线程的容器。进程是程序的运行环境,而真正去执行程序的,是一个个线程。

​ 需要注意的是,Java的线程与 *** 作系统的线程是一一对应的。

为什么有线程

​ 在计算机的发展历史中,是先存在的进程。随着计算机的发展,计算机的处理速度远远大于外设的处理速度,为了避免等待造成的浪费,提高程序的执行效率,才出现的线程。

JVM的自有线程

​ 我们随便写个测试函数,然后debug看一下:

   @Test
    public void test(){
        new Thread(()-> System.out.println("=================new thread=================")).start();
        System.out.println("==================sleeping==================");
    }

debug的线程情况如下所示,可以看到除了主线程外,还有几个jvm的自有线程:

Signal Dispatcher:把 *** 作系统发来的信号分发给适当的处理程序

Finalizer:在学习垃圾回收的时候学到过,如果对象实现了finalize方法,就会加入到一个队列中,然后由JVM创建的低优先级的线程去执行,就是这个线程

ReferenceHandler:是JVM创建的优先级最高的守护线程,作用是在垃圾回收的时,ReferenceHandler主要作用是对需要回收的对象进行后序的回收清理工作。

部分源码:

		Thread handler = new ReferenceHandler(tg, "Reference Handler");
        
        handler.setPriority(Thread.MAX_PRIORITY);
        handler.setDaemon(true);
        handler.start();
线程与进程的关系 进程线程起源不同先有进程因为计算机的处理速度远远大于外设的处理速度,为了提高CPU利用率,才出现的线程概念不同具有独立功能的程序运行起来的环境,是个实例,是系统分配资源与调度的单位CPU的基本调度单位内存共享方式不同不同的进程之间的内存通常是不共享的线程之间,是有共享内存的用有资源不同共享
1.进程代码段(重点)
2.进程的公有数据
3.进程打开的文件描述符
4.信号处理器
5.进程当前的目录
6.进程用户ID与进程组ID
私有:
1.线程ID
2.寄存器组的值
3.线程的堆栈(重点)
4.错误返回码
5.线程的信号屏蔽码数量不同一个进程可以有多个线程,至少一个开销不同1.线程的创建、终止时间比进程短
2.同一个进程内的线程切换时间比进程切换时间短
3.同一个进程的各个线程之间共享内存与文件资源,可以不同过内核进行通信线程更轻量级
并发、并行、串行

​ 下面这张图就可以表示出这三者的区别(非原创,从慕课网视频截取):

这里用生活中的现象举个例子,假设我们有3个小伙伴住在同一间房。

串行

​ 这个屋子里只有一个浴室,那么三个小伙伴只能排队,一个洗完了另外一个才能去。

并发

​ 屋子里只有一个浴室跟一个厨房还有一台电脑。三个小伙伴商量了一下,小伙伴A去洗澡,B去做饭吃饭,C去打游戏;然后A去吃饭,B去打游戏,C去洗澡;最后A去打游戏,B去洗澡,C去吃饭。

并行

​ 这个屋子里有三个卧室,三个小伙伴一人一间,夜晚来了他们都在睡觉。


同步异步、阻塞非阻塞

​ 其实同步异步、阻塞非阻塞是两个维度的事情:

​ 同步异步指的是被调用者是否主动告诉调用者结果

​ 阻塞非阻塞指的是我作为调用者,在结果返回前能不能做别的事情

举个栗子来理解下。

​ 到吃饭的时间了,你肚子有点饿了,而这个时候你妈妈在厨房做饭。

同步

​ 如果你妈妈会主动告诉你饭好了,快来吃吧!这就是同步。

异步

​ 如果你妈妈在生你的气不想搭理你,饭好了就端上桌自己吃,也不喊你,等你闻到香味,或者饿得受不了了去饭桌上一看,诶饭好了,可以吃了!这就是异步。

阻塞

​ 如果你就蹲在厨房门口,饭不好你就不走了,啥事儿也不干了,这就是阻塞。

非阻塞

​ 如果你决定看会电影等饭,这就是非阻塞。


高并发

高并发:同时有很多请求发给服务器

​ 还是上面的例子。

​ 今天游戏出新英雄玛西了,三个小伙伴都非常急想去玩一下,都在急着抢电脑。

高并发与多线程的关系

​ 多线程只是解决高并发的一种手段,但不是唯一的方法。比如上面的栗子中我们可以加一台电脑(扩容?),如果是数据库的高并发,我们可以加缓存等。

高并发的指标

​ 还是上面几个小伙伴抢着玩电脑的栗子:

QPS

​ 每秒查询/请求数

​ 同一时刻有多少个小伙伴过来抢电脑

带宽 PV(PageView)

​ 综合浏览量

​ 这一台电脑一天内的试用次数

UV(UniqueVisitor)

​ PV基础上的去重

​ 这一台电脑一天内被几个小伙伴使用,一天内一人只算一次

并发连接数

​ 同一时间内有几个小伙伴可以玩电脑

服务器平均请求等待时间

​ 这几个小伙伴平均等待了多久就可以玩到电脑了~

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5434319.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存