00:00
好,下面呢,我们来去看一下这个所得最简单的一个应用场景。那我这里呢,有一张图,它这个图里面呢,有一个服务,这台服务呢,将来我们会单独单机部署啊,在我们的服务内部呀,有一个共享资源。那么此时呢?有大量用户同时发送请求,要去访问一个共享资源。那么每一个请求啊,在我们的服务内部都会对应有一个线程,那么此时呢,多个线程啊,就会同时操作我们的共享资源。那么这样呢,必然会带来一些线程安全问题,那么因为呢,此时呀是多线程无序并发访问我们的共享资源。那我们怎么来解决这样的一个线程安全问题呢?我们就可以使用锁,因为锁的话呢,它可以保证我们的多个线程能够有序串行化的访问我们的共享资源。那么使用什么的锁来去解决这个问题呢?哎,我们就可以使用咱gbm给咱提供的两个锁,那么gbm呀,给能提供了这样两个所,一个呢是reinent lock,那么以及呢,还有这个central这样两个所。
01:17
啊,如果你们学过上因果的教程啊,啊或者课程啊,那么你们必然呢,对这两个锁呢,不会陌生,因为呢,这两个锁呀,在我们的GUC的课程里面是重点讲解的哈。那么这两个锁呢,呃,咱之前呢,一般都在慢方法里面来去演示的,或者说呢,是在j unit里面来去测试的啊。OK,那么在实际开发中,我们该如何去使用这两个算呢?啊,又会有什么样的问题呢?好,那么接下来的话呢,我们就写一个DEMO,那么首先呢,来演示一下,如果我要在工程里面基本使用这两个锁,该如何去使用。那么,它又会带来什么样的问题?
02:01
然后带着这些问题呢,我们来去更加深入的来去了解这两个锁,然后呢,我们来逐步的去引入咱们的分布式锁。好,咱废话不多说,我们直接呢开始整打开我们的idea,在idea里面呢,我们来创建一个DEMO工程,这个工程呢,我们就创建一个spring部的工程哈,那有时间下一步。那我们的坐标呢,咱可以填上it硅谷,然后呢是是第4BEAUTY gun lock这样的一个工程,那咱是GDK1.8这个,那么然后呢,加一个点,那就直接下一步。那我们只要引入外包的驱动器就可以了,因为呢,我们现在访问的是服务内的这样的一个共享资源,咱不需要连外部的数据库。我们就直接呢,下一步,那么然后呢,分类啊,我们这个工程呢,就已经重建好了。
03:03
那创建好之后呀,我们来去看一下啊,咱首先呢,请还是看依赖,那么依赖呢,咱都需要一些依赖在这里啊,它默认呢,给我们引入了死平不同的负工程版,米号呢是2.6.7。那么然后呢,GDK呢是1.8版本的,那么web的启动器是我们选的哈,让g unit它也给我们引用进来了啊,单元测试相关的引用进来了。那么然后呢,我们将来啊,咱们肯定要有共享资源,那共享资源呢,咱们是以类的形式来承担的啊,以实体类的形式来承担的。那么既然有实体类,我们就可以去引入我们的learn book,这样呢,我们的get set方法呀,咱可以通过book呢,自动帮我们去生成。好,我们来去导入一下它的一个依赖。然后呢,找到我们的配置文件啊,在配置文件里面,咱首先要配置一下这个端口号,防止版本这个端口号冲突。
04:00
好,再来一个啊server,点上put来一个10010这个单口号。那么单口号呢,我们就配置好了,然后呢,咱该去写Java代码了哈。那代码该如何去下手呢?啊,咱可以呢去参照这张图。啊,我们怎么去写这个代码。那最典型的?并发性问题无非就是超卖现象了,比如说呢,咱们这里呢,就以超卖现象为例来去演示,那这个共享资源呢,自然而然就是库存了。那比如说呢,我们就写一个实体类啊,来一个to这个这样的一个实体类。然后呢,咱通过to service,那么来去操作咱们的这样的一个库存啊,每访问一次我就可以减库存。那我们还得要有对应的躺出了来,以接收用户的请求。然后呢,来以调设备的方法,那么减库存啊好,那么咱的结构呢,整体呢就是这样子的。
05:00
好,那我们从下往上,那么来去实现。首先呢,我们来去封装这样的一个视频类。来找到我们的基础包,在这个包路径下面啊,咱们创建一个实体类给它放,放在一个po目录下,我们就命名为talk,然后呢,咱去加一个代塔注解,这样呢,后续我的属性啊,它就有get s法了。那我们再去添加一个字段,然后这个字段呢,我来一个音频类型的,然后呢,有一个to好等于呢,比如说我在写死啊,就是5000啊,内部库存资源啊,然后库存量呢是5000啊。那每访问一次,我就对这个库存呢来进行减一操作。啊,那么这个设计类有了之后呀,我们就可以去创建一个。Service。那么给它放在service这个包下面,我们就命名为stock service。然后呢,我们要标记它是一个service啊,然后呢,我们只要有一个共享资源啊,来一个rabbit,然后是talk啊,然后呢,Talk,那么这个库存啊,必然是一个单立的。
06:10
啊,如果是一个独立的情况下。那我们这个每一个请求进来。它是不同的库存,那也就不存在共享资源的争抢问题了啊。所以呢,我们这个service呀,嗯,不管你是哪个群进来,你只要进入这个service操作的是同一个啊库存对上,那我们就可以呢,在这个地方啊进行谬一个,那么库存对象。对象,那么由于呢,在死盆里面啊,我们的这个service它默认是单立的啊,都是同一个啊,不管是哪个请求进来,都是同一个service。那同一个service里面,那我们的to,也就是new的同一个to,因为它只有一个啊,它的话呢,在service初始化的时候,它就已经初始化好了。OK,那我们呢,来去看一下啊,我们可以呢,去写一个方法,那这个方法呢,就减库存的方法,比如说呢,就来一个deduct deduct减库存的这样的一个方法,那么这个方法呢,我就可以来一个stock,点上set stock,我在原来库存的基础上来去减一就行了啊,来设置为减一。
07:24
然后呢,我再去输出一下我们的库存余量,这是库存余量,那么还有多少,诶加上咱们stock给上get stock。那么这个service呢,我们就已经写好了,然后再去写CTRL了,我们来去new一个CTRL了,放在CTRL这个包下面,然后再命名为talk CR了。然后在这里呢,咱们来一个啊CTRLL注解,然后在这个CTRL里面啊,咱们来去注入我们的service。然后呢,是wa的。
08:02
好注入好之后呀,我们也去写一个方法啊,这个方法呢,它可以接受get求,那么请求路径呢,咱可以来一个。呃,来一个talk,那是de dedu这样的一个路径。然后呢,我们的方法呢,返回结果集啊,咱可以随意返回一句话啊,等你来一个spring类型的。那么然后呢,我们方法名啊,咱叫吧,嗯。让每访问一次,我就开始调service的那个减固定的方法哈,那么this.service点上第减好之后呢,我可以去成一句话,比如说我就来一个啊,Hello,可能是talk directoror。单还有这样一句话,好,那么然后呢,咱们这个地方啊,我们这个地方呢,它默认情况下啊,他认为这是一个视图名称对吧?啊OK,咱可以加一个注解,或者我们可以使用那个rest场T出了组合注解,那这样呢玩起呢会更加方便一点。
09:06
二等使用CTRL了。那么这个工程呢,我们就已经搭建好了。
我来说两句