00:00
各位同学大家好,接下来我们给大家介绍一下CS的缺点,那么从开始讲到这儿我们应该明白了,CS它最主要的优点就是可以避开SNCH这样重量重量级的加锁操作,通过底层对UN safe类的使用完成一种轻量级的加锁方式,对吧?避开的阻塞那么好处们已经体会过了,那么缺点呢?最主要的有两个来,一个是循环时间长了以后会导致CPU开销过大,第二个是ABA问题,都是非常两个经典的问题。面试中。保不齐会被问到,好,那么首先我们来看一下什么叫循环时间长,开销会变得越来越大,来同学们,我们可以看到啊,源码上这段源码呢,我们这儿呢,已经看过很多遍,它有个do啊。下面我们的问题是,如果成功了。收工如果失败了,是不是不得不在这儿反复的都要产生了自学,那么也就是说如果CS失败,并且这个线程特别倒霉,每次去抢的话都没抢到,他只能在外面不停的旋转,那么这个时候会一直进行尝试啊,如果这个CS啊,长时间都没有获得资源,一直不成功,可能会给CPU带来很大的开销,相当于就是个死循环了,OK,好,那么这样CPU空转呢,性能下降你是会很大很大的啊,凡是有一利就有一弊,好虽然说这种情况呢极少出现,但是同学们呢,要明白一下这个do啊,毕竟不是最优啊,短期。
01:35
可以,但长了也不好。第二个呢,就是ABA问题,那么什么叫ABA问题呢?以及它是怎么产生的呢?来。情况是这样的。CS算法实现一个重要前提是需要提取出内存中某个时刻的数据,并在当下时刻比较并替换。那么在这个时间,注意时间差。这这个类。会导致数据发生一些变化,那么比如说啊,线程一从内存位置V中取出一个A,初始值是一号,线程取得A,这个时候线程一拿着A欢天喜地的走了,忙活着,这个时候呢,线程二。
02:15
也出来取的是A。而且线程二进行一些操作以后,先于线程一把我的值改回去了,也就说这个值已经变成B了,改过了一次,但是突然线程二又觉得不合适啊,又把它改回来了,是A,那结束,那这个时候线程一回来了,进行CS操作时候发现哎,内存中仍然是A,那么按照我们的只检查结果啊,开始结果是A,最后的结果也是A,中间过程我们不管,那么这个时候虽然说预期是OK的,然后呢,线程一呢,也就操作成功了,那么虽然说我们这个预期OK,最后的结果也正确,但是中间的过程可能会出现一些麻烦,所以说尽管线程一的CS操作是成功的。但是不代表这个过程就没有啥问题。那举个最。
03:02
俗的案例大家都清楚。比如说啊,这是你。没问题吧?那么现在啊,各位同学。你有一个女朋友?他呢?就是A。假设你就是县城一没问题吧,那么你跟你女朋友分开的时候,她挺好好的,是A没问题,那现在啊,你呢,就去出差了。那女朋友呢?就在这儿呢,独守空房,突然你晓得的,你的对手在磨刀,隔壁老王在练妖,他已经知道。你撤了,你出差了,人不在家,那没什么好说的,这哥们就过来了,当你关怀了一下,这么说,同学们。能跟上,可能这个里面的值啊,已经由A。被改为了。一个B。已经被老王给动过了,那么完了以后老王呢,敲门烟的完成以后。
04:06
做好了上号准备,开溜之前,他又把这个B又改回来了。然后这个里面的值你会发现还是A,然后呢,老王直接你晓得的。是不是就撤了结果呢,等你回来的时候。你想得的,虽然说这个。内存里面的值还是A没问题,结果是正确的,但中间这个过程你晓得的是已经被人动过了,那么总总体而言这个是不安全的,所以说这个就叫ABA问题。好,那么。财务上也会有,一开始账是对的,是A,然后呢,检查财务的人员离开了,突然有人中间取出,中间呢就把这个钱呢挪出去了一部分公款私用,最后虽然说把这个亏空给填上了,但中间这个过程也是不安全的,所以说在这种情况下呢,我们可以明白,尽管线程一的CS操作是成功的,哎,之前之后我只管了两头,中间我没管。
05:12
那么所以说不代表这个过程就是没问题的,那么这个就是我们的什么?两大最恶心最头疼的问题,一个是循环时间长,开销大,另外一个就是ABA问题。
我来说两句