00:00
那我们再给大家补充一些细节,我呢现在给每一个方法,我们在这来写的时候,以及读的时候,只要加锁成功呢,我都打印了,如果写那就是写锁加锁成功,如果读那就读锁加锁成功,包括释放呢,我也都会打印,然后呢,我们之前说了一个,如果我们是写读状态,我们来先写再读,我们这个读呢,就必须等待咱们这个写索释放,等待我们这个写索释放,而且如果是写呢,如果我们这个血加血的模式,这个写加血我们其实就不用测了,这肯定是一个阻塞的方式,阻塞方式我们必须呢,下一个鞋索等待上一个鞋索释放才能完全进行。但是我们现在来测一个读写模式,读加写,如果我正在读的过程中,我又要写一个新数据,我们这个写用不用等待呢?我们来看一下,我们现在呢,让血也延迟30秒,包括呢,让毒也延迟30秒,我现在来重新启动我的这个服务,我们来看一下在这种状态下,我们先读再写的状态下,我们会不会写等待。
01:11
我们来测试一个。我来现在来打开一个新的这个页面,好,新的页面我们现在来看一下,我们先来测试read来进行读取操作,我们这呢有一个读好,我们先把这停掉,然后呢还有一个写,我们这还有一个right,那么现在先来测试先读再写。那这个释不释放,我们现在以控制台打印为标准,只要加锁成功,那就说明我们进行了,因为我们这有延迟,不能看我们最终结果,好,现在我们来看读走,那现在读呢,我发现读加锁成功,们再来看写走,诶我们发现写呢并没有加锁成功,我们在这儿要等待过程,那只有等到我们这个毒全部进行完了以后,们在这一块呢才能打印写成功,我们现在就来等待毒索释放,只要毒索一释放,我们这儿肯定就会有写锁加锁成功来看一下。
02:05
诶,我们发现控制台打印,只要读锁一释放,我们这个写锁呢就加锁成功,包括写锁在我们red里边的样子,我们之前也看过,这就有一个RW lock,这是我们的这个写索,它的这个模式是一个写的模式,那读索是什么样子,我们在red里边也来看一下,现在写索释放了,来重新来读,我先来读取一下,刷新我先来读,那么读枷锁的状态我来刷新一下,来我们发现这有一个读索,这有一个一号,现在呢模式是读,然后呢,我们在这儿,并且额外保存了每一个毒所的详细信息,在这儿还都有,那如果我们这个并发毒,我们多个毒,我们这个毒需不需要等待呢?来看一下这个效果,毒锁加锁成功,那现在来测试多个读好一个毒。两个读,三个读,四个读,我们来给大家准备了四个读,我们让这四个读呢都来进行。
03:01
那为了效果更明显,我们可以先来尝试写,如果我来写数据,写锁加锁成功,那读呢就必须等待,但是呢,写完之后我有四个读,一个两个三个四个,好,那现在来看效果,我们现在数据库呢,现在只加了一个写锁,是我们这个Mo right,好,现在是鞋索,那下来等鞋索释放。诶,我们发现呢,写锁一打印释放毒锁呢,四个全部同时加锁成功,所以呢,相当于毒锁就是一个无锁状态,大家都能用,我们在这一块呢,包括加了几个读索在这儿呢,都并排顺序都写着,所以我们来记录一下我们这个读索啊,包括如果是读读模式,我们一个写后边的四个读,我们这个读读模式,这个相当于无所我们这个读读。我们叫相当于咱们这个无锁,因为我们刚才看到控制台毒锁呢,这四个同时就加锁成功了,并发毒,他们会同时加锁成功并发。
04:11
只会在red里边,只会在red中记录好所有当前的毒索,他们都会同时加锁成功,他们都会同时加锁成功,但是我们刚才也测试了一下读写模式,如果我正在读的时候写也得等待,有读所写也需要等待。总结一句话,就是只要有咱们这个写的存在,那这个写呢,无论先写还是后写,只要有写的存在,无论是读写还是写读还是写写,只要有写的存在,那么呢,都必须等待,如果写在后边,那还得等上一个,无论是毒锁还是写锁在这儿释放。
05:06
如果写在前边,那它后边的就必须等待,无论是读锁还是写锁,所以呢,这就是我们说的这个读共享,哎,它是一个共享锁,写呢是一个排他,我们也可以称为互斥,也可以叫独享,这个独享锁它呢只能是一个人当前拥有这把锁,那么就给大家详细的再补充一下这些细节。
我来说两句