00:00
好,同学们,通过前面的讲解,我们已经对field update相关的理论知识介绍完成,那么接下来我们按照规范来尝试一下如何做一个字段级别进行原子更新的案例,我们手下见真章,代码说话OK,来,同学们。搁到这儿,我们先写好一部分简单的基础代码,定义了一个类,就是我们的资源类里面有一个数据银行名称,那么相当于我们的中国建设银行,这个银行名字应该是不会变化了,那么这个就是我们刚才所说的死的数据,那么好看看我们的需求。以一种线程安全的方式操纵非线程安全对象的某些字段来实行这种精细化的打击,对吧?那么十个线程,每个线程转账1000,请不要使用SYNCH,尝试使用in field update来进行实现。好,那么这啊,我们图省事,In money。那么等于零,OK,那么这个呢,就是我们的什么钱数,那么相当于说我们转账啊,或者是这个的话,只要涉及到数字变更的啊,那么它呢一定是。
01:08
要保证现场安全的对不对,所以说那么我们现在换以前啊,我们先来看以前的synchized的avoid ADD,我们就做一个最简单的了,那么money,那么现在加加你晓得的这个synchized,就这么一干100%可以实现现场安全对吧?那么他加锁是锁的整个对象,那么下面我们来看一眼,先不用这个的时候,我们两种方法呢,给大家对比一下啊,那么这由于涉及到十个线程,那么可能啊。看lunch,我们也需要用。好,那么搁到这儿完活以后,那么同学们,我们现在呢,十个线程来,每个线程转账1000。OK,那么来吧,换我们以前bank can,那么在这一块at点一下加个点一下加个对吧,那么来吧。
02:05
Try finally,那么如果说搁到这十个线程,每个线程彻底做完了减一个,那么。接下来看lunch,那么最后我们来看看。这个result大概是多少,那么也就是我们这个银行账号里面。来吧,我们的money这个数字那么大家都清楚啊,我现在加了,那不出意外的话,那么时乘1000,答案是多少?我相信不用我多废话,这是我们以前的知识,没有任何问题,那接下来我们晓得的不想加。还要保证这个数字是1万,结果正确对吧,咱们来吧。跑一下,那么同学们。结合我们这两张图给大家演示,Before after OK,大家看数字啊,马上就不对了。好了,那接下来我们就要试试了,也就是我们一再强调的一句话,说明白,请不要给我。
03:02
什么全身麻醉?加锁细粒度化,我们只要局部微创要求你不加锁,OK,好,那么接下来按照我们这儿。开高,我们要干的活呢,如果要干这个事儿。第一步,更新对象的属性,必须使用什么public volatile来进行修饰啊?OK,这是第一步,那么第二步我们呢。直接拷贝吧,整小段啊,按照我们的规范和手册那。搁到这儿。我们来看出。都是抽象类,每次使用都必须使用静态方法这么一个好了,那么怎么玩了,相当于引入我们的out integer field update。来,那么现在你对哪个操作bank account这个来操作,那么好,我们在这儿的话呢,我们呢直接是field update,不然这个类的名字太长了,那么这个尿可不可以呢?不可以,为什么它呢?当然你可以拗这个啊,它在构造方法里面,它这是有的啊,我们这提一嘴,你看受保护的无操作构造函数供子类使用,但是现在我们这儿不需要,我们一般是使用静态方法的这个来创建一个更新器,所以说呢,我们这儿呢,基本上呢不在六。
04:25
用这么一个回事来点尿阿,那么通过什么反射,你要对哪个对象里面的哪一个字段来进行我们这样的field。Update原子化的操作好,那么下面呢,我们就要对我们的bank。can.class哪个字段啊?那么这个字段是不是就是我们这的这个money,那同学们没有任何问题吧?OK,好了,那么给他甩过来啊,当然不好看。那么搁到这完了以后呢,我们现在来实现我们的什么。不加S。
05:03
OK,然后呢?还要保证。高性能。原子性类似于我们的什么局部?微创小手术。OK,好了,那么public和刚才一样,那么transfer。Money,那么这个时候的话呢,它这块我们来呃,要传的时候呢。传个对象进去,你对哪一个对象来了,那么这个对象以后field update上面已经定义过了。过了这。来,那么现在我们是不是get and相当于我们的爱加加,那么哪一个对象啊,就这个银行账号来,兄弟们没问题吧,好了,那么接下来呢,和刚才呢一样,还是熟悉的配方,还是熟悉的味道,我们接下来应该玩的呢,也就是我们这个方法的调用好了这个I的。
06:02
我将其屏蔽,那么来我们现在呢,直接就是用bank account.transfer然后呢,丢进去的呢,就是这个对象来保证大家的执行效果,那么来同学们,我们来看一下,现在呢,我们就很happy了,根本没有加锁,那么现在来看看。能不能达成我们的效果啊?给它后台运行跑起来,大家看照样是不是可以达到我们的1万啊,那么来多跑几次没有任何问题吧,这个A已经住到了跟那个size。没有任何关系了,OK,所以说通过它我们也可以得到我们一个正确的答案,这个就是我们刚才所说的局部微创小手术,只是对这一个字段进行了对应的修改。和原子操作。
我来说两句