00:01
好,下边呢,我们来看一下这个方法,呃,包括开这个方法之前啊,呃,我们看一下这个图,我们现在说到哪了。大家看我们现在说到这儿了啊。就是。CTPH这个类的。Entry with type这个方法里边我们跟到这儿了,跟的是这。我我们一个一个来看这个图,就是我来画的这个图,大家怎么看?你看这个类。里边。这类里边有个entry with type。方法,Entry with type。这个类诶。
01:06
Entry with type。呃,这个方法里边跟是不是跟着这个方法跟着他。所以你看这个图,这个方法里边跟着它叫entry with b。给你来,所以下边。这都是。Enter with priority这个方法里边的,你看这三个都是。你看。这个这个。这个这三个都是这一个方法里边的啊,分出来的,那我们首先现在看谁就看这个。叫internal contest.internal entry,我们现在要跟的是他。我现在跟跟这个。
02:01
啊,这个名称啊,注意这个名称是这个默认的名称,不错吧,跟你来。以后这是个内部类的啊,内部类的,然后呢,内部类里边这个方法啊,然后这name是这个contest名称那个默认的名称,然后诶,这这是什么东西啊。这个参数是空,这是什么,看一下。Origin就是它的。呃,来源啊,这是它的来源。因为我们要确认一个contest啊,需要两个属性。一个属性是contest名称,一个属性是它的来源,你看。名称来源对吧,和这个是照着的啊,哎,这两个现在都有了,那你看它首先这这这不是我们那个这local嘛,对吧,所以首先从。
03:02
呃,获取。获取。Contest。如果是空,那就就从那儿获取一次是吧。这应该这样写就更更好。尝试着。从这。过去。对吧。呃,如果它是空,我要做一个工作。喂。嗯,这样说吧,12点。Logo中没有。Contest。则从哪。缓存map。和。尝试则。尝试着从缓存map中过去。这是缓存map啊,我先回答这个缓存map,对啊,缓存map里边有哥们说。什么意?
04:03
缓存的T。Contest。Value为这写的default not,你注意啊,Default,它这实际上是。Entrance。为什么这样说?我们可以看一下entrance note,下边就有,你看entrance note。是不是继承子?对吧。所以。这个啊是什么,是entrance note啊,Value是entrance note,所以我这是不是根据这名称先获取到我的entrance note。获取note。如果这个note是空。哎,我现在获取这个n node是干嘛的?就是为了构建我们的contest,我们的contest里边需要我们的TR。
05:05
明白吧,所以我们需要构建它,那如果现在啊,它是空的。如果没有这个en note怎么办?我要看一下啊哦,这是什么,这这个缓存map呀,这缓存map的size如果比。Contest阈值还要大,怎么包括now contest,我们刚刚是不是前面说过这个no表示什么?就表示数量超过阈值了,所以这不就对住了吗?这不就?和前面的相吻合了是吧。啊若啊,缓存map的。Size。嗯。大于大于。Contest。呃,数量的。
06:00
最大。阈值。这。说明说明什么说明,嗯,当前。呃。请求数量已经超。除了。咱不要说请求了,就是这。则不则返回。这就行了,咱不用说他他他说明什么了,因为说明什么我们前面已经说过了。是吧,直接返回一个东西。否则呢?否则。然后。再从缓存。是不是从缓存再获取一次?啊,如果它是空,诶又获取一次,为什么又获取一次。在这是不是获取了一次,这是又获取一次。是吧,是不是缓存。
07:01
呃,这边是缓存map嘛,这都是缓存,这缓存缓存map来获取对吧,然后判断一下它是now,这又判断这是什么东西,这典型的是什么结构。检测。是不是就双重检测所啊,你也能看出来。能看出来啊,就是。检测。做。钢琴。DC,对吧。哎,我们说双重检测锁啊,他。他要解决什么问题?他解决问题就是并发。为了防止并发。呃,并发创建。双轮检索啊,它。对了。帮助。
08:00
嗯,并发创建。那我们一会儿看一下啊,在这我再从缓存map上获取一次,如果它是空是吧,又判断如果它比最大的阈值大,我还是返回no contest,如果不是呢。在这创建。是不是在出现创建了。对不对。就是为了防止什么,防止并发创建。在这。创建一个什么。Entrance。是不是我创建一个en not,然后我把这个not干嘛添加到。叫。新建的。No。添加。官方图,看我们官方图。是不是not添加到root里边,Root就这一个,一个应用是不是就一个,哎,你看我们现在。
09:02
是不是你就和前面啊那个原理图就对到一块一块了啊,再往下是干嘛的,你不是创建了一个nod吗?我把这个nod放到了。Map。我这新建了一个map。是吧,呃,然后呢,把这个map,把缓存里面map的所有的数据放到这个新建map里边,然后把这个note放到这个新里边,在。让我们这个缓存map在指向这个新建的map。整体就完成了一个工作。将新建。No。嗯。写入到对。不过大家注意啊,我不知道这种结构大家以前见过没有?这是干嘛的?这为了防止什么,他为什么这样写,你直接是吧,这个。
10:03
点put它不就行了吗。那为什么还中间要新建一个?你注意啊,这就我们为什么要读别人的代码。读优秀的代码,我们要自己写,像这种问题你能不能意识到?它是典型的一种结构啊。叫什么叫?呃,或者这样说吧。为了。防止。迭代。稳定。问题。迭代稳定性问题行吗?英文啊,以。It had read。一。It。Rich。It。
11:03
Stable。迭代稳定性问题啊,为了防止这个什么意思呢?所谓迭代稳定性问题啊,简单的理解这个,你如果想详细了解,你再去查相关资料。呃,框架里边用,为了就这种代码结构非常多啊。呃,在我们,呃,这个S里边,包括ne里边这种源码里边啊,Spring里边像这种源码非常多。呃,迭代稳定性是一个什么问题呢?就是对于一个共享集合。对,共享集合。的写操作。我们。最好采用这种方式。如果不用这种方式,有可能会引发读操作,读走什么?张书记。这是接待稳定的问题。
12:00
他用的场景啊。就是。接上吧。呃,就是这个这个这个怎么说呢?嗯。A。呃,共享。集合的。急急。几何的?写操作,它应用的景就是对共享的写操作。这样一个环节。啊,为了防止迭代稳定性问题是什么?就是所谓的迭代,就是我呃便利的去读。如果我不这样做的话,他有可能会引发我的是我这边没写完的,你就把它读走了,因为他有共享嘛。所以有可能会读到大数据。呃,这是我们需要留意的这么一点啊,好了,这这不管怎么样啊,前面啊,我们终于获取到了contest。然后呃,终于获取到这个node啊,有了node了,那不是放到缓缓存里边,然后呢。
13:00
是。将将contest。啊。Best。En。No。公交为。对不对。然后呢,你你你里边是不是需要。你看他里边不是需要这个来源嘛,是吧,所以呢。嗯。初始化。Contest的。来源orange是吧,然后这句话是干嘛。讲。Contest。写入到哪儿?Thread。对不对,放到local,所以。
14:08
这是什么?就是他。是吧,我们创建一个contest,然后把它放到了third。OK。
我来说两句