00:00
各位同学大家好,咱们继续来学习GUUC高并发编程,刚才我们完成了集合的线程安全的演示,包括说了它的解决方案,那下面呢,我们来讲解下一个内容,给大家讲一下多线程所的新闻内容,那这里边的首先给各位先演示八种所的问题,通过这个问题咱们演示出来这个so nice的关键字里边的相关特点,包括用ight的关键字,它是否是同一把锁,以及锁的范围到底是怎么样,那下面呢,咱们通过一段代码研制出八种所的这么一个问题。那我们来看一下,首先这个代码给各位已经提前写好了,然后咱们看一下这个代码比较简单,主要是演示里面的八个问题,那我们看一下啊,首先在代码中按照咱的操作过程。
01:03
我在里边写了一个资源类,我们叫这个货就是手机类,然后在手机这个类里边,我写了三个方法,第一个方法就是发送短信,第二个发送邮件,第三个就是一个get哈的方法,然后三个方法大家仔细看它们的特点,大家注意啊。这两个方法什么特点,是不是都加了SNE的关键字,然后这个方法是不是一个普通方法,所以咱们写的两个带SNE的关键字,也就是两个同步方法,然后另一个方法是普通方法,然后写完之后咱们在里边我们就是创建了两个线程,分别调用两个方法,然后咱们来演示出所的八个问题。在演示过程中,我们之前提到,因为这个大的方法它什么时候创建不确定,所以它为了效果明显,我在两个线程中间加了一个叫sleep,让它先。
02:06
等待这个100毫秒,用它让咱们看到更明显,所以咱们下面来看一下里边有哪八个问题,咱们把八个问题的现象先演示一下,最终咱们分析一下八个问题为什么是这种现象,从而说明所耐的关键字里边的相关所的这个特点。那咱们来看一下八个问题是什么?首先我们看第一个问题,我这里写到标准访问的时候,你是先打印短信还是先打印邮件,也就说咱们的这两个方法都加了SNE的关键字,然后我下面做一个输出,大家注意我怎么做,比如现在啊,我在里边我先去掉啊,我就扭上一个bone,然后new bone中。咱们的第一个线程里边,我来打印这个短信,在第二个线程中,我来打印这个邮件,咱们现在是两个线程,然后我执行一下,那大家可以想一下,现在如果说我执行它的效果应该是怎么样的,是先短信还是见右键。
03:16
应该是什么样的,那我们来看一下啊,这个效果是什么样的,现在再来执行是大家清楚看到。怎么样,是不是先短信后邮件,因为我在里边加了一个sleep,这么做有它效果,绝对是唯一的一个结果。这是咱们的第一种情况,先短信再邮件,然后咱再看第二种情况,这里写到,比如现在我们停四秒,在短信方法中,然后看他怎么打印的。那这段代码我把它打开,大家看这写法啊。Time unit seconds是不是秒,Sleep加个四表示你停留四秒,然后停留四秒之后咱们还是短信邮件都进行这么一个调用,那咱们看它是什么样的一个结果。
04:08
个别看现在是不是等待四秒,然后等待四秒之后,你看效果跟刚才是不是一样的,就是还是先短信再邮件,这是咱们的第二个效果,然后这个说完之后,下面呢,咱们来演示第三个就是现在我新建一个普通的方法,也就是这个方法,这个方法上没有次冷带的关键字,只是一个普通方法,而现在咱们就是。调用短信再调用哈方法,咱们看怎么样,这是现在这个B线程,我先给它注掉,然后咱们调用里面这个叫get哈方法,那大家说这该怎么打印。各位注意啊,我在短信里边是不是停了四秒,而hello里边直接输出,并且hello方法还不是我们的size这种方法,那咱们执行看他什么结果。
05:04
大家注意看啊,先怎么样,是哈,然后等了四秒之后,是不是才是咱的短信,所以这就是我们的第三种情况,先是哈喽,然后才是咱的短信,这是我们演示的前三个。咱们先演示完,然后最终给大家做分析,然后咱们看第四种情况,我这里写到就是现在啊,我有两部手机,是先打印短信还是先打印你的右键。那我们试一下什么叫两部手机呢?比如现在我再加上一个phone,咱们叫这个PHONE2等于U上一个four位,这是不是调二部手机?那我现在这么来做,在第一个线程中,咱们用第一部手机调用短信,然后在第二个线程中,我用第二部手机调用这个。
06:00
邮件现在咱们来执行一下,各位看它是怎么样的这么一个效果,大家看。先什么?是不是先有电,然后等了四秒之后,是不是才是咱们的短信,所以这是里边的第四个情况,咱们做了一个说明,我这里一边演示各位同学可以一边想一下为什么这个样子,一会给大家做个分析,所以前四个就也是完成了,然后下面咱们看第五个场景。我这里写到啊,我有两个什么静态的同步方法,一部手机包括两部手机,那咱看怎么执行什么叫静态通方法,两个注意都是,比如说我现在啊,在方法上面咱们加上一个static是不是静态的,这两方法我都是静态的,那咱演示首先我先用一部手机用这个phone。一部手机现在两个都是这个静态通用方法,那咱们来执行,咱们看它什么效果啊,看这个结果,然后现在你发现。
07:09
第一个是短信,第二个是不是这个邮件,比如咱们的两个静态方法,一部手机这种场景,那比如现在我两个静态方法,两部手机,咱们看怎么样。这个叫货二,然后咱们执行。咱们看它怎么样,大家看到目前没有输出,然后咱们等一会儿发现和刚才效果是不是一样的,不管你是一部手机还是两部手机,只要你是静态控制方法,它都是这个顺序。啊,这是第五个,第六个,然后除了这个之外,还有最后两个,就是一个静态方法,一个普通方法,一部手机,一个静态,一个普通,两部手机,咱们看它是怎么样的,那我来试一下啊,就是一个静态,一个普通,这个是静态,这是普通,那咱们来执行,我们先用一部手机试一下。
08:09
然后咱们看它怎么样啊是。什么样一个效果大家看。是不是先转线?啊,就先邮件,然后再一块就是这个短信,这是我们的。第七个情况,然后咱们再看最后一个情况,现在方法不变,只是咱们调用的时候呢,换成了两部手机,那咱们看它最终是怎么样一个结果。大家注意啊,和刚才的效果是不是一一样,还是先邮件再短信,所以这些呢,就是咱们演示的四个奈子关键字,关于锁的八种情况,咱们就完成了演示,最终看到的里边的不同的效果,那这个效果看到之后,下面的给各位同学咱来分析一下这个过程为什么是这个样子。
09:04
其实咱们分析的就是两点,第一个就是格奈目前它是否用的是同一把锁,然后第二个就是它所的范围到底是怎么样的,那我们来看一下啊,首先我们看第一个情况,标准防位。就是我现在都是s nice,然后咱们是先短信还是先邮电,是不是先短信后邮件,当然你停了四秒,还是先短信再邮件,那这个什么意思呢?大家注意啊,也就是跟这个有关,因为我现在先执行是这个短信方法,短信之后我在这里边是不是停了100毫秒,然后这里边才是这个邮件,比如说这个过程中,当你在方法上边加上一个S的关键字,那这个时候大家想一下他锁的是谁。或者锁的是什么范围?这各位要明确啊,当你加到方法上,加上the nice,那它目前所的应该是你当前的这个对象,也就是咱们通俗说这个这次,比如现在我调这个方法,那他把我当前对象锁住了,这个方法调是不是只能等待,当它结束之后,它是不是才能调用?所以咱们的第一个和第二个情况都是先短信再邮件,因为咱们的SNE所得是你的当前的这个对象。
10:30
啊,这是我们说的第一个,第二个,然后第三个好理解,因为我这个方法没有加锁,所以它跟我的锁无关,它就是先制小,然后这个后置行啊,这是第三个,然后大家看啊,这里边比如现在我有两部手机,那效果就不一样了,因为两部手机我这是第一部,这是第二部,而这个锁的是你当前对象,但是我两部手机是不是两个对象,所以他们用的就不是同一把锁,那最终结果就是这个先输出,这个第二输出,因为这个等了四秒,所以他就第二个输出。
11:07
这是咱们的第四个情况,两部手机SNE锁的是当前对象,你两个不同对象,那它里边肯定锁的是用的不是同一把锁。这是第四个,然后咱们看第五个,第六个效果都一样,这是什么意思呢?说两个方法都是这个静态的同步方法,就是加上一个CD口,那这里边结构就是先短信再右键。那它为什么这个样子呢?大家想一下,首先大家考虑啊,当我加上s sta加S之后,那这个时候他锁的是谁。或者锁的范围是谁?给各位强调啊,这个时候呢,它所的范围就不是这个这了,而是你当前类的这个对象。Class,比如咱们通俗说这个字解码对象就整个这个大的这个class把它锁住了,所以咱一锁住的话,那我后面操作它里边肯定是先短信后邮件,加上S这个静态锁的是当前类的这个class,所以咱们是里边的这种场景就是第五个和第六个。
12:22
然后咱们看最后这个第七个和第八个,这里写到一个静态方法,一个普通方法,那这时候输出它是先邮件后短信,那为什么,也就是说目前呢,他们锁的这个范围肯定是不一样的,另外他们用的还不是一把锁,这个锁的是大写这个class,这个锁的是当前这个Z,所以两个不是一把锁,那最终就是先这个。右键再短信,那这个什么意思呢?给大家说的更具体点啊,比如说我举个例子,比如大家知道啊,我们一栋楼一进入楼是不是有个大门呀,当你再进入楼是不是有很多的房间呀,每个房间是不是还有它的大门,比如现在我把整栋楼锁住了,那我楼里边那个门是不还可以进入,我只锁住整栋楼,但是里边的门我并没有锁,所以这个证明他们用的不是同一瓦锁,你可以列为s static,就是整栋楼那个大门的锁,而这个sne是里边每个房间里面那个锁,所以他们用的不是同一瓦锁,最终效果就是这个样子。
13:36
所以现在我们通过锁的八种情况把s nice相关的特点给各位做了这么一个演示,最终呢,咱们把里边的几种情况给大家最终来总结一下,我们来看一下啊,S的实现同步的基础,Java中的每个对象都可以作为锁,具体表现为以下三种形式,第一种形式,对于普通的同步方法,比如咱们加个SNE这么一个通用方法,那它里边所的就是当前这个实例对象,也就是咱们通俗说的这次,然后第二种情况,对于静态通用方法,就你加上一个CD,那它锁的是我们大写的这个C的class,然后第三个对于这个同步方法块,锁的是S这个括号里边配置的对象,所以这就是关于S的实现锁的机制里边的八个问题的演示,通过这个演示大家。
14:37
掌握S里面那个监管使用,包括你是否用的是通一把锁,以及你锁的一个相关的范围。
我来说两句