00:00
各位同学大家好,接下来我们对Java多线程的相关概念给大家做一下串讲和总结,我们分为这么三个步骤。一把锁,两个并,三个乘,那么OK,什么叫一把锁呢?不用多说,凡是有Java多线程相关基础知识的同学都会听说过SYNCH的,哎,这个就是保证Java线程安全。加把锁这个100%,面试中会问,工作中要用,笔试中会考,那么至于说SYNCH所相关的问题,我们留在第四章给大家进行深度和详细的解释。那么接下来。面试中常问的这两个大家听一下好,所谓的两个病主要就是指什么是并发,什么是并行?好所有的三个程,那么你知道进程、线程,那么请问你知道什么是管程吗?那么接下来我们就把这些相关概念给大家呢梳理清楚,对于我们后面源码级别的讲解,这三个概念非常的重要。
01:03
好。那么大家请看所谓的两个病,主要就是指并发和病情,那么它们两个有什么区别呢?所谓的并发是指concurrent,注意我们这门课是不是叫JC。什么编程,并发编程,其中这个C。就是我们这儿的concurrent,一般大家都听说过一句话叫高并发,没有人会说高并行,OK,这是第一个知识点,第二个所谓并发con current,所谓并行parallel,那么请问这两个有什么区别呢?我们先来看一下它的学术定义。所谓并发是指在。同一个实体上的多个事件,注意一第二个是在几一台处理器上面同时处理多个任务,那么一台处理器对应着多个处理任务,他们是什么一对多的关系?
02:00
同一时刻其实是只有一个事件在发生,那么也就是说同一时刻其实他在做的就一件事儿,好,这叫并发。第二个什么叫并行呢?大家请看,是在不同时间上的多个事件,在几台多台处理器上同时处理几个任务,多个任务,那么上面这个是一对多。这个就是多对多,那么大家请看,对于并行而言,同一时刻大家真的都在做事情。你做你的,我做我的,但是我们都在做,哎,各自独立,彼此互不干涉,但是这个并发呢,和这个并行呢,是截然不同的两个概念。好,那老师讲到这儿还是有点懵逼,说人话,你能不能一句话给我讲明白?挺好。所谓并发,并发,大家常见的春节期间去12306火车票站上面抢票,或者我们在电商网站的秒杀,就是高并发的一种体现。比如说现在大家要秒杀小米手机,今天早上有10万个请求线程,早上十点涌入服务器,那么就是同一时刻怎么着?
03:12
在服务器上面同时处理多个请求抢购的任务,那么这个时候我们该限流的限流,该扩容的扩容,否则的话大家一定会抢出问题。最经典的我们在Java多线程的卖票案例上是不是学过重票、复票和错票?所谓的并发就是指同一时刻多个请求线程对同一份资源发起集火攻击,那么这个时候就是并发。那么好,什么叫并行呢?说句简单一点,泡方便面就是并行。讲完了,好老师。愿闻其详。那么请问你去便利店买了一桶康师傅方便面?回到家里面泡面,正常情况下你一定会一边用热水器烧热水,一边撕开调料包放调料,那么这个时候水烧开的时候,调料包也撕完了。
04:05
倒上热水,泡好面条,开工,那么这个时候我们可以明白,同一时刻,你一边在做热水的工作,一边在做撕调料包的工作,我们呢,都在做,但是各干各的,哎,所以说这个时候就是什么多对多相关的关系,那么最终我们把并发和并行用一张图来做一个经典的说明。对于我们的并发concurrent。大家请看两个队列的排队,几个一台咖啡机,那么大家是不是多个请求线程过来集火攻击同一个资源,那么这个就叫并发。那么什么叫parallel并行呢?两个队列在排队,但是有两台咖啡机,那好比说你在撕调料包,我在热开水,各忙各的,这个就是两件事情各自独立并行处理,所以说一定要深刻明白什么叫并发,什么叫并行,好,这是我们的第二个知识点,那么第三一个。
05:07
三个程什么意思呢?也就是我们所说的进程,线程和管程,哎,以前呢,只会问问进程和线程,现在会问你什么叫管程好,那么下面我们来看一下,其实这三个呢也不难,那么通过前面上一讲,我们对。Java对应的open jdk c语言的源码分析我们已经体会得到,结合GVM对于native方法的调用,操作系统和GBM1配合,我们会清楚所谓真真真正的线程是由操作系统所提供和分配的。那么再次强调我们的任务管理器在这儿有一个进程,进程里面都有一些线程,OK,那么换句话说,对于我们的进程和线程这种概念完全来自于什么呀?操作系统和语言关系不大,那么所以说我们这儿可以看得出。所谓进程。
06:01
就是系统中运行的一个应用程序,就是一个进程,每一个进程都有它自己的内存空间和系统资源。我们数据最简单的就是我后台运行着的任意一个程序就是一个进程,比如说现在我开启着脑图软件,也开启着idea开发工具,那么这个就是两个后台进程。那么大家请看,对于我们的idea工具,目前我所占用的是。2.5g左右的内存,那么它呢?这块是一块公共的内存空间,在这个进程里面有很多很多的线程共同和他一起分享这块内存空间,所以说我们所谓的线程就被称为轻量级的进程,那么在同一个进程内会有一到多个线程,相当于说一个进程就是一个大工厂开了一块空间,占了个厂房,在这个里面有多个干活的工人,一个或多个,那么大多数操作系统都会进行实续调度,来把它作为一种什么基本的单元,那么进程是真真正正干活的,好,那么这个时候我们来看。
07:04
对于我们最后一个概念。管城又是什么概念呢,来?广成,俗称莫尼塔,也就是我们平时所说的所好,举个例子,那么同学们大家都清楚,假设我现在六。Object。那么此时这个就是一个对象,那么假设我现在再来一个线程,它是T2,如果里面我现在需要写一段同步代码,那么对于这样同步代码块,或者是我们看过源码所知道的同步方法都清楚,但凡加了S这个O现在就作为了一个monitor。监视器,它就是我们这儿所说的锁来。Lawyer monitor呢?其实是一种什么同步机制?它的义务是保证同一时间上只有一个线程可以访问被保护的数据和代码。
08:00
对于这一段代码,我相信每位同学都能看得明白,谁持有这个O,谁就相当于持有了进入房间的这把锁。同一时间段只能有一个线程进来争抢,OK,那么现在T线程所持有别的线程就只能等待。所以说GVM当中同步是基于进入和退出监视器模拟它对象。也就是说,这个monitor所对象就叫管程,每一个对象实例都会有一个monitor对象,也就是说每只要你每一个六出来的对象几乎都可以做。管程作为锁,作为监视器,模拟实现一种同步机制,所以呢,模拟对象呢,会和Java对象一样一同创建并销毁,底层也是由自家来实践,OK,那么来这个概念是来自于哪儿呢?那么他主要就是来看看你在日常工作学习的积累当中,有没有看过比方说我们的GVM2这本经典的书籍,来看看你的学习能力,那么在GVM。
09:04
这本书第三册的原版上面,我们可以看到在这有这么一段话。执行线程就要求先成功持有什么管程,哎,相当于说如果多线程在并发的情况下,为了保证线程安全,我们要加size,谁先抢到这把锁,谁就持有管程,谁就可以进去干活,访问资源,他抢到锁,持有管程以后才能执行方法,最后当方法完成,无论是正常的还是异常的,它释放错,它释放管程,释放锁,类似于我去卫生间,看到卫生间现在没人,我进去以后。拉上门栓出来以后解开门栓,OK,那么在方法执行期间,执行线程持有的管程,其他任何线程都无法再获取到同一个管程,所以说我们现在就可以了解,根据GVM的原话,那么所谓的管程也就是我们C相当于我们持有的所OK,好,那么这三个概念,那么请大家呢,务必了解,对于所并发和并行。
10:05
进程、线程、管程就给大家先介绍到这儿,那么对于size我们后面会深度详细的讲解,大家请跟着我进入到后面的分享和交流以及学习。
我来说两句