00:00
将来呢,我们说说这个lock同步锁,实际上之前这lock同步锁我是不是已经给大家打了一个基础了呀,对吧,大家已经这个了解过了,然后呢,来一个叫做lock,我们说之前我们讲了用于解决多线程安全问题的这个办法有几种啊,是三种啊,分别是同步代码块,第二个是同步方法,第三个就是同步数,对吧,所用于一说用于解决这个多线程安全,哎,安全问题的方式是不是一共有三种啊,第一种那么就是叫做同步代码块,第二种叫做同步方法,但是他们俩是不是都需要这个关键字啊啊oed是不是S关键字啊,对吧,我们说原来呢,或者说在GDT1.5以前解决多线程安全问题是不是就是这两种啊。
01:00
那么我们说现在呢,在JDK1.5以后,它出现了一种更加于灵活的方式,那就是我们说的三,叫做同步同步锁,对吧,那这是一种更灵活的方式,叫做lock,对吧?那这是这里是1.5以后,除了新特性,那么我们可以说什么呢?上边这个cize这是不是都是用的叫做隐示的锁呀,而下边的这个lock,那是不是叫做显示的锁,对吧,说它是一个一个是一个叫做显示的锁,是不是显示锁呀,怎么个显示锁,我们所得通过一个方法去手动上锁啊,通过什么方法上锁呢?是lock呀,对吧,我们说需要通过叫做lock方法进行上锁,相应的你必须通过对吧,通过叫做unlock方法进行释放锁,那这个就是。
02:00
啊,这里K1.5以后出的一个特性,那现在呢,有了这种显示锁,显示锁就意味着什么呢?我们是不是可以对这个锁进行一个控制啊,对吧,不像原来是不是都是一一种块式的解决多线程安全问题的方式,什么叫块式的白马贯,是不是一个大括号啊,然后头头转脑的时候说下了也是一个大,那现在呢,我们就可以通过lock a lock对吧,去显示的对所进行一个操作,这是一种更加灵活的方式,对吧?那么我们说那既然有了这种新的方式用lock处理,那原来的这个是不是就意味着不用了呢?那当然也不是,我们说实际上呢,当然这个也是一个有争议的,实际上我们说这个lock的应用稍微的也是有那么一点点风险的,什么风险呢?就是你是不是得通过方法去施摸索,你得保证这个方法去执行嘛,所以说我们通常把这个安放哪,哎在单里就保证它去执行,那么一旦它没有得到释放,这个锁没得到。
03:00
释放的话,那后续那安全隐患那是不是多去了,对吧,那后果就可想而知,所以说它是存在一些风险,而上面那个singleized,关键是这种隐示锁是人家gbm底层支持的一个关键字吧,由GM他会帮你去维护,对吧?所以说你只能说这是一种更加灵活,更加高级的处理多线程安全的方式,但是呢,你不能说完全的可以替代原来的CNE关键字,对不懂吗?那么接下来咱们是不是就试试这个log组怎么用呢?之前咱们是不是举个例子叫做卖票,还记得吗?说ticket呀,我们让它employment roundable一下,然后呢,来个卖票程序,在这里搞一个比如private t等于in呀,Private in的take是不是等于100,然后在这里我是不是来个卖票啊,我说well,如果T呢,大于零就说明有票。如果有。
04:00
票我是不就卖票啊看点get name拼上这个冒号,或者说这样写,说完成几号窗口完成售票,余票为多少吧,对吧?余票为减减T对吧?那这样的话呢,我们这个T就写好了,在梦中呢,我创建这个ticket的实例,New一个ticket,然后呢,New一个TH是不把ticket传过来啊对吧?把ticket传过来,它起名叫做一号窗口,然后去点start,然后呢,我说启动三个呀,说三个窗口同时售票100张,这没问题吧,对吧?三个窗口同时票100张,那这个时候我们问它存不存在多线程安全问题啊,是三个线程同时访问共享数据,这一定会存在多线程安全问题啊,那这个时候我要是右键运行,这里头貌似可能好像还没产生什么问题,但是我们说我们是不是可以把这个问题。
05:00
稍微放大一点啊,注意我们稍微的把问题放大一点,说如果它大于零,说把多线程安全问题把它放大对吧,省得它不出,我们说是不是在在这里来小睡一会啊对吧,来个200毫秒啊出来看一下,那这个时候呢,我们再来右键。运行,那么这个时候呢,我们再看存不存在多线程安全问题,嗯,有点慢对吧,三三个零啊,三个五啊,两个七啊,这是明显出现了多线程安全问题啊,对吧?那至于这种多线程安全问题,咱们也不用过多解释了吧,对吧,之前咱们讲的已经非常详细了啊,那因此说既然产生了这种多线程安全问题,我们说解决多线程安全问题方式说不这三种对吧,上两种是不是都会了呀,对吧?那这种实际上第三种是不是也会了呀,那这个时候呢,我们要上锁,它需要我们是不是得获取云的实力呀,是吧,通过lock,这个lock呢,它是一个接口,它需要一个是不是找它的时间类啊,叫做reintreat re lock呀,对吧,创建一个它的实例control shift or导一下包,注意,也是叫做con lock下的吧,也是con包下。
06:21
啊,那么上锁的话,我是不是要在这里通过lo.lo方法去上锁,相应的呢,你是不是得通过unlock方法释放锁,但是切记无论如何得把这个释放锁的操作放哪,是不是得放finally里啊,然后呢,这个呢把它放这那这样的话呢,说通过叫做lo点啊a lock来个释放锁的操作,这句话是不是必须得有啊对吧?上锁这句话必须得有,并且你还得把它写到final中去,对吧?你如果不是换锁,那么后果大家也能想明白,右键运行。
07:04
那这个时候再来的话。看看。睡到200毫秒是不是有点多呀?行了,再稍等一会儿。行了行了,那这个多线程安全问题是不是已经解决了,对吧?好了,那这就是第三种方式叫做lock同步数,对吧,跟上边两种方式完全一样,解决的效果呢,也是完全一样,只不过呢,这种是个显示锁,它提供更加灵活的一个对同步处理的方式,搞定了搞定,那么搞定了以后呢,这个呢,我就先单录一下。
我来说两句