00:00
各位同学大家好,欢迎继续收看上硅谷GUC高并发编程课程。刚才的内容中呢,给大家演示了所的八种情况,通过八种情况咱们说明了的关键字,它里边所的范围包括是否是同一把锁,那下面呢,咱们把多线程锁给各位进一步来演示,咱们来看下一个内容。下一个内容呢,给大家来讲解这么一个内容,这个内容呢,叫做公平所。和非公平所。那这个什么意思呢?下面给各位来说明一下,什么叫公平锁,什么叫非公平锁,然后大家看啊,咱们在前面呢,在这个lock接口的时候,曾经用lock接口编写了一个卖票的这个例子,也就是我们模拟出这个三个售票员卖出最终30张票的过程,这个过程中其实就涉及到这个公平所和非公平所,那它什么意思呢?大家看一下啊,比如说我现在我们写的代码中,咱们是new,上一个是不是叫re entra local,就这个re安里边呢,我们可以传入一个参数,然后咱们看一下它的源码中。
01:22
咱们之前用的是这个无参构造,然后大家看这个构造里边是不能传个布尔类项参数,这个参数就表示它用的是公平锁还是非公平锁,如果说咱们不传参数的话,大家看里边啊sync new一个什么。是不是叫no fire,这表示就叫做非公平锁,比如说咱们目前写的其实是一个非公平锁的效果,那这效果是怎么样的呢?给大家演示一下,咱们看一下啊,这里边有一个典型的一个特点,那我现在把它执行,我们来做个演示。
02:01
然后各位看啊,大家看到啊,目前是什么特点。咱们目前是不是有三个现场,或者说有三个售票员AABCC,但是我这个票都被谁卖出去了,是不是都被A卖出去了,这么做呢,从咱的功能上考虑是没有错的,因为咱锁把它已经锁住了,就没有这个多线程中产生那个问题,但是里边问题是什么呢?你注意啊,这个做法就叫做非公平所,什么叫非微控所?你看我这里边。AA,我把票都卖出去了,那我的BB跟CC干什么,他是没得可干了,A很能干,比如现在我这公司啊,卖票他是根据票呢来计算人的这个工资,比如说你卖一张票给你提成,比如说十块钱,那我A把票都卖出去了,钱是不是都被他挣了,那我BBCC怎么样,是不是一分钱都挣不到,这两个人是不是可能被饿死了?所以这就是公平所和非兵所里边的非公平所一个特点,它会造成你的县城会出现被饿死的情况。
03:13
我A都卖了BBCC,它里边就没有卖票,那他可能一分钱挣不到,最终可能被饿死,这就叫非工程所,而这里边比如说咱们这里边说到非工程所,给大家进一步演示啊,也就是说第一个你直接用这个无仓构造,包括在里边加上一个boss,它就是非公平锁,它的特点就是可能造成一个线程把所有活都干了,其他县会出现被饿死的情况,就咱们刚才的例子,AA都卖了BBCC就没得可干了,它就会有为出现线程饿死的情况,这叫非公平所。那比如说啊,我现在啊,把这值咱们改个处处表示什么,又叫做公平所,那咱们看一下啊,公平所是什么特点,现在我把它再执行一下,咱们看这个特点啊。
04:09
大家注意啊,你看公平锁AA卖了几张票之后,BBCC是不是也都有票可卖掉,非公平锁它里面就是一个人可能把票都卖掉了,但是我在公平锁前提条件下有一个特点,比如咱们经常说一个词叫阳光普照,就是我去卖票,你也会卖到票,我吃肉让你也喝个汤,这就叫公平所和非公平所的特点。这各位得知道,而这两个锁呢,各自有什么优缺点呢?给大家来说一下啊,首先咱说这个非公平锁,给大家在里边我来写一下啊。非公平送。然后它的特点是什么呢?可能会造成你的线程被饿死的,这情况就是说A都卖了,然后BBCC被他干了,但是它的好处什么呢?就是它的执行的效率高。
05:05
这叫公平锁,一会咱们看源码给大家进一步分析,然后咱说这个公平锁。公平所什么特点呢?就是咱通常说那个叫阳光普照。就是你这里边啊,所有人都会把票卖出去,但是它的问题是什么呢?它的效率。相对要低一点,至少比非公平所要低一些,那这两什么特点给大家进一步说明啊,各位可以理解公平所什么特点,就是我现在比如说我这里边要做一件事情,那我首先比如说举个例子啊,比如现在我们要排队嘛,或者我要去买个东西,然后你在卖东西这个地方,我先礼貌的问一句,说这里有人吗?比如这里有人,那咱是不是就排队呀,没有人我是不是就直接买了,这就叫公平锁,我先问一句有没有人,有人我就排队,没人我再进行这么一个直接操作,或者说咱说那个占座的例子,比如现在我看一个空位置,我可能问旁边人这里有人坐吗?那人说有人坐,那我们就不去做了,如果那人说没有人坐,那咱就直接坐上去,这就叫公平锁,咱们礼貌的问一句。
06:17
那什么叫非公平锁呢?就是我现在啊,不去问,我只要发现这个地方有空位置,我马上站上,不管他有没有人,这就叫非公平所,那这是两个特点,而他为什么效率低呢?他刚才提到我是不是要礼貌的问一句啊,而我问的过程无形中就增加了时间的消耗嘛,啊,比如我要问一句有没有人,比如那个人可能等一会儿,他回答我说这一有人,那我可能就不会往上去做了,这就叫公平所和非公平锁,在默认情况下,它用的是非公平锁,咱们改成处,就会实现出一种公平锁效果。而在实际中呢,咱们怎么选用公平和非公所呢?大家要想到,如果说你想考虑到效率高,那咱就用非公平,如果你想要公平,那要考虑到它的效率低的问题,根据实际来选取,要么公平,要么非公平。
07:14
这是我们提到的公平锁和非公平锁的特点,然后这个呢,咱们看一下它的源码的特点,我把它的源码打开大家看啊,首先我们看第一部分就是它的无仓构造,在它的无仓构造中,它是不是用了这个对象叫NNYXNC,这个叫非公应所,而且这里边传入一个布尔类型参数之后,它根据布尔类型做了一个判断,就是写了一个三元表达式,如果只是处,那它就是公平所,如果值是false,它就是非公平所,那我们来快速看一下啊,先在这个非公平所。非公平锁呢,就是直接占据你这个位置,直接进行我们的操作啊,就直接进行我们后续操作,然后咱们再看那个公平锁它是怎么做的。
08:07
我们看这个圆码。大家看啊,首先在里边呢,它做了一个事情,叫这个A块,也如里边加这个has q的这个方法,这个方法什么意思呢?就是我刚才说到的,他先礼貌的畏惧,说这里有人吗?如果没有人的话,那我们要往下进行操作,如果有人的话,那我们就进行这么一个排对,就是礼貌的畏惧这个操作,所以咱们现在就把这个公平所和非公平锁给各位,就一个说明,各位记住两种锁的特点,包括他们的实现的过程啊,就是你这里边最终总结一下啊。非公平锁会造成县城饿死情况,因为但是它的效率高,因为它不需要排队,直接抢,谁能抢到就是谁的。而公平所什么意思?咱就理解为这种阳光普照的方式,我在进行操作之前,先礼貌的问一句,说里有人吗?如果有人的话我就排队,没人的话我直接行操作,而他效率相对较低。而我们在选择的时候,如果说你追求公平,那肯定效率低,如果说你不追求公平,用非公平效率肯定会高,当然会造成县城恶损的情况,这是关于公平所和非公平所得这么一个说明。
我来说两句