00:00
好兄弟们,老规矩,现在先把自选所的理论讲完了。我们说过了,看书没有用,为什么你们要来?上回我跟杨哥学,杨哥能节约你们的时间。那么换句话说,我每一个知识点讲完理论以后,必给你一个配用代码说话,所以说这就是我们的区别。那么这个话干嘛?同学们,你自学看完以后没有动手敲过代码,跟没看一样。再说了,你。上了班以后,你哪有那么多时间去看书啊,每天996加班,虽然说你们工资高,回到家你要是住在什么昌平霍营这种店儿,到家基本上晚上十点还算是不错的。而且那个书你也就是帮京东听清库存,你买了也没时间精力看,所以买书容易,看书难,搬家还麻烦。就这个意思。好,那么兄弟们过来。请手写一个自选锁。你看哈,这个题目特别刁。
01:00
他又没问你别的所。他不可能说请你手写一个可重入锁吧,那这不无聊吗?星子本身就可重塑,还写个屁啊,好比说现在你给我造个车可以,你给我造个太阳看看,不可能。过来。自学。自选锁的好处,循环比较获取,直到成功为止,没有类似位特的组算,OK。行了。这边来。通过CS啊完成自学操作,好我们呢,哎呀不废话了,直接撸代码。来兄弟们这波O吧。我们来。一切城区的入口不重要。那么来。什么reference?知道我前面为什么要先提前给大家讲原子引用了吗?我讲过了,如果说我们的是这样啊。Auto这个是不是叫原子整形呢?那么现在就是什么整形,加了这个奥,是不是叫原子整形?
02:06
那么言下之意,假设我们要。原子Uzi。原子order。是不是说过,那么这个时候我们要用什么原子引用分析,那么这个时候。Reference,放行。周一。这个时候的发型,大家猜猜应该是什么?我们现在是不是讲多线程,所以说不好意思啊,难道在这儿呢,我们要手写实现一个什么自选锁。Thread奥to瑞等于六奥米克同学们第一步能跟上。只不过以前的泛型装的是什么user,现在的泛型装的是现成这一步听不听得懂?第一步能不能跟上?好,那么来干嘛呢?这个时候就牛逼了,那么这一步叫什么?原子引用。县城。
03:01
听到好,那么接下来。Public word my look,为了跟look方法区分,这个叫my look,杨格版的听懂。那么好,那么接下来呢,好抱歉。扯淡了。是不是应该放在这儿。来吧。兄弟们认为现在奥reference里的主物理内存里面的共享变量。现在。是多少?是不是还没有现成丢进来,现在是不是初始之是难啊,同不同意啊?现在就说还记不记得就是。奥米和inte,你在这写个五初始就是我不写就是零,还记不记得,但是对于引用类型,我们知道引用类型。初始值是什么?那这一步能跟上兄弟们过来?干嘛呢?Thread类。等于。
04:00
点current这个就是代表当前进来的这个对象,不不当前进来的这个线程听不听得到。我们过来。干什么呢?好,My current干嘛呢?Come in。OK。接下来。自学。不要着急。自旋的本质是什么?是不是就是while循环加CAS compare方法?那么好,那杨哥你咋个自选?我呀。注意啊,这这块你用do外要和外药都可以听懂了吧?只不过从杨哥自己的编码角度,我就不喜欢用do外要你们呢。应该一样吧,还好大家可以采用人类的方式沟通,你过来。Atomic reference。点。Compare and set,什么鬼。我期望值如果是那。
05:05
当好真实值也是。那我就把我自己。丢进去这么说。听不听得到。能不能理解兄弟们?那么这个时候请看。他这是啥?布尔驰,你跟我讲现在。第一次进来。假设main方法里面有个A线程,它先访问这个东东,那么你跟我讲,默认现在初始值是不是个那。是不是啊?那么这个时候。现在这个就是A线程,A线程比较并交换。我通过CS啊。现在CS是第一个来访问这个对象的,这个对象是个原子引用,要引用某一种线程,但是现在是不是根本没有任何一个线程进来过?A线程是第一个。那么A线程就希望你的里面是空的,它里面是空的是不是代表我是第一名,我是第一个来的。
06:04
如果是空的,我就把我自己放进去比较成功,将奥reference里面的值设为当前线程,就是我们假设刚才模拟进来的这个A线程,第一步同学们能不能跟上?能不能跟上?第二步。干嘛呢?那么如果它是返回是个布尔值啊,这一块是不是就是个处了。对不对,那么如果我是处的话,那我变成在这死循环,所以说我这要干嘛。取反,那么这个时候是不是跟这个取反是一个意思呀。听到你看杨哥编怎么编,是不是也就照着源码抄啊,你看看源代码以后你就明白了,怎么过来。然后。完活,那么言下之间,兄弟们,你告诉我。现在A第一次进来。我希望里面是烂的。真实值是不是烂的,那么是不是当前这个对象,这个内存地址里面的真实值和我的期望值是一样的,我就改成我自己听懂。
07:07
那么这个时候。这个方法得到一个错,整个方法取反得到一个负,那么这个时候是不是A线程第一次进来,根本就不进这个外要循环,听懂了吗?这一步能不能跟上?好,兄弟们看着啊,杨哥可没有加什么NCH,更没有加什么look,听不听得懂。怎么过来?Public,贵的MY。安。我们干嘛呢?跟这个东东一模一样。也就是当前进来的这个线程。那么呢?兄弟们擦一下。我这块。我要干嘛?啊。来。我这个叫什么法,是叫解锁。
08:01
获得所是才需要不停的去Y啊。解锁干嘛?那么进来这个线程reference啊,第二,Compare and set,如果解锁,谁解锁,是不是自己要解锁用完了。如果我自己用完了。那么这个时候我就把它变回那同学们这一步,听不听得懂?啊。一个是那。线城一个是,县城一个是,那听到我按lock的时候,是不是我自己解锁,我骤然现在进去卫生间,我进三号开三号门,我上门刷。我现在去厕所,我我憋不住了,我希望厕所里面有人还是没人,肯定是希望厕所里面是那没有人,如果没有人,我他妈进去是不是就爽了。好,这个时候我在里面释放完内存,用完卫生间了,我要安lock,那么这个时候是不是还是我?那么这个时候干嘛?我是不是希望我要出去,废话,现在在。
09:00
它里面的是不是我,我要出去,一出去以后解锁,然后我把这个对象里面东西变成了给下一个人用,听懂了吗。好,那么这个时候过来。看这。那么这个时候干嘛?是不是不是MY。这这样吧。My work my unlo方法,同学们听不听得懂?好,那么这个就是我们自己写了什么?Mylo和my unlock兄弟们再强调一遍。没有加SNCH,根没根本也没有用look接口,听不听得懂答案根本就没有上锁,我们用自学,用反复的循环比较来进行。什么老规矩?那是不是线程操纵资源呢?兄弟们听不听得到?咱们来吧。干嘛呢?首先A线程。这个时候就是我们的AA线程。干嘛?
10:01
第二。Mylo,我调用这个方法对不对?A线程先获得,我进去以后我先甩,我先占用这把锁,听懂。五秒钟。五秒钟以后,兄弟们。我们在解锁听。但是兄弟们告诉我。五秒钟这块是不是要占很长时间,你跟我讲,我这个B会不会进去。啊。好,那么接下来等我写完,那么为了保证AA这个线程绝对的先。运行完成,那么T。那干嘛呢?一秒钟相当于这个是我们的main线程听懂,那么这样的话到这儿停一秒钟,是不是保证AAA线程绝对是先起到。好,那么接下来干嘛?我们的B线程来了。
11:01
这个是BP兄弟们这一块听不听得到。请看B线程,先要获得锁,然后它再解锁,请看我们的逻辑推演,兄弟们。现在首先先启动的是谁?回答我啥?AAA进来了以后是不是麦洛卡?过来。现在要用它。这个线程第22行,这个现在是不是就是AAA。AAA是什么首次使用,那么这个时候就像一块处女地一样的,这个人是这个是这个东东,这个对象里面的东西是不是从来没有人碰过的?过来。现在。哎哎哎,他们听不听得到。然后呢,AAA。CS啊,比较并交换,我希望里面是那回答我首次进来这个里面就像一块发现新大陆,一块处女地一样,这块是不是就是那?
12:02
把自己丢进去。这个东方。就是错。整体取反,我是不是就跳出Y,听懂了吧?然后我在这儿跑这儿干嘛。自己持有这把锁五秒钟听不听得到?暗示一秒钟以后,那bbb是不是上来了?Bbb也要想去获得这把锁。过来。两它threat,现在这个22行是不是就是我们的BBP。B线程。他们不好意思啊。B线程希望里面是,那但是你懂的,那现在里面是啥是A,那么这个时候干嘛这个比较就变成失败,没有办法设置啊,它的布尔值返回就说false false啊在不停的去比较,是不是烂呢,是不是烂呢,是不是烂呢?哥们儿,AAA线程你卫生巾用完了吗?你出来以后我是不是还能要。
13:02
那五秒钟以后,AAA线程干了一件什么事啊,洛克,那么AAA呢,进去了以后示范完了。我希望还是我,如果一样,我就,那我是不是出来了,那么这个时候你懂的就变成什么,AAA调用了安洛克。Go out离开,那么这个时候别忘了bbb线程是不是在这转着呢?由于下面这个AAA已经给它按落了,终于有一次啊,它弄成了,那那么这个时候是不是在把PB设置进来bbb干嘛?完了以后你看它并没有用多长时间,那么这个时候马上他再去调用它的my unloook,我们马上就会打出b BB in work my unloook,整个逻辑能不能听懂?能不能跟上?好,那么兄弟们。这个时候我们来看AAA和bbb,那么不妨我们为了好看一点干什么呢?我呢,加完锁以后我也让bbb停一秒钟啊,那么这样让大家有点间隔好看好,同学们请看我们的演示效果。
14:11
AAA进来了,Bbb也进来了,但是你看bbb是要等着五秒钟。你看A用完了一秒钟以后b unlo了,能理解。所以说B。BB这个线程现在就是只能通过不停的在while里面自学。反复的去判断,轮没轮到我呢?没轮到我呢,轮没轮到我呢,你用完没有,你用完没有,你用完没有,这样的话干嘛,是不是会有多次循环调用。好处。不用阻塞坏处啊,可能长时间,那比方说干嘛。A就爽了,A干嘛?你懂的,我持有这个,我就在卫生卫卫生间里面干嘛。五天五夜。那么这个时候你懂的,你这个系统后台里面是不是一堆。
15:03
状的在这就像类似于死循环一样在这自寻。那么系统的性能是不是就被你拖慢急剧下降了,所以说这个原理你懂了以后,你不要乱用。那么这个时候干嘛?多线程的并发非常重要。你别进去以后呢就乱来,一言不合就跟你讲,我用了自选锁哟,要有适用范围呢,你要知道它的利处,好处是什么,不用阻塞,坏处是什么,如果长时间不能获得的话,这个循循环。重了以后性能是不会下降。那么这个时候干嘛做高变化的程序员有两种,一种程序员入职了,系统就变慢了,这个程序员离职以后,系统是不是就恢复正常了?能跟上,哎,所以说呢,这块的话呢,知其力其弊,这种情况下兄弟们才能写出好的靠谱的代码,那么现在兄弟们回答我自选锁懂了吧,你再来看看这句话。获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,明白了吧?
16:05
所以说再回顾杨哥教你们方法论,怎么学it,怎么学Java,怎么学大数据,怎么拿30万、40万、50万、100万甚至高薪。理论代码小组机,你第一次读这种理论,你屁,你根本读不懂,我把官方源码给你,你也读不懂。不要去听那些什么其他那些浮躁的九零后装逼,一言不合就说是什么,哎呀,看看源码不就懂了吗?你给我说,说白了,太阳。胡说八道,你看源码你也看不到。只有这样抽丝剥茧的把每一个小知识啊,拿一个小段代码验证通过,彻彻底底明白它的底层原理和深刻的思想了。你才能够OK。好,那么同学们,我们的自选锁就给大家介绍到这儿。
我来说两句