00:00
呃,那首先第一步我们得有一个线程池的工具类,对吧,因为我们采用第二种方式,因为我们设计了两个数据库啊,所以呢,我们要有一个线程池的工具类,我们来写一下啊。Thread。第九。好,那这个呢,我想把它构建成一个。单例构建成一个单例OK吧,呃,单立呢,分懒汉是二汉式对吧,呃。哪个里边有限制安全问题啊。懒汉式,饿汉式,哪个有线程安全问题?还记得懒汉式跟二汉式的区别吗?好,二汉式上来就直接创建对吧,懒汉式呢,节省资源一点,用到的时候再去创建,好嗯,那我们呢,就用懒汉式,那既然有限制安全问题我们要解决一下,用双重校验的方式来解决这个。
01:10
问题OK吧,好,那咱们练啊。首先我们定一个pool。对,JC包下的。大家有没有听过两个东西,一个JM,这个肯定听过对吧,还有一个东西呢,叫JC,有没有听过。这两个东西,如果你未来啊是做实时,就是做Java开发啊,只要你未来做Java开发。这两个东西我建议大家工作以后还是说你花一点时间对吧,还是工作以后你最好都要去学一学,花点时间学一学很重要啊,特别这个guc,那这个就guc看啊,Java u con。Guc是什么东西啊,就这个JUC对吧啊,Java的并发包,Java的并发包它就是讲是一些锁呀,并发控制啊,并发编程啊,对对,就是类似于这样的东西啊好,那我们就就不管这个了,嗯。
02:11
然后呢,私有化构造方法对吧。私有化构造方法,好,那接下来呢,我们提供一个方法来返回这个东西吧。Public static返回值对吧,Get instance或者直接叫get,它无所谓啊,这个名字倒无所谓对吧?好,那我们要做这种。双重校验的。那汉对吧,那最终呢,我们肯定是返回这个什么。他我们要肯定给他赋值对吧,肯定给它赋值啊。好,那么接下来我们应该怎么做呢?首先得判断对吧,If。
03:00
这个。它如果等等于,那那我就要进来要去创建。对吧,那如果直接创建它是不是还有线程安全问题啊,因为假如说第一次你就有两个线程进来了,AB它俩校验是不是都是呢?是不是创建两次,所以里边应该怎么写加速。对吧,好,那接下来呢,把这个。我加个类啊。呃,我能不能直接创建。直接创建它是不是还有问题啊。是不是如果你直接创建它还是有问题。对吧,哎,那要怎么样在里边再做一次校验,为什么它直接创建还有问题呢?你比如说AB2个线人进来。他俩都判断为呢,对吧,假如A线程快一点,他先拿到这个锁,那B线程是不是在这等着。A线在先进来对吧,好,那在里边直接创建出去了,那B接下来拿到锁是不是又创建一次,没必要,所以在里边再怎么样,再判断一次if。
04:05
等于那对吧,那到这个位置我们才需要干什么去创建这个对象,好里边是参数,我们先不聊对吧,我们先看整体,整体有没有问题。对吧,做两次校验,诶,那这样加锁这样呢,也不会影响最终的效率,那有的说我把第一个干掉,我直接加锁,那效率就低了,因为你第一次经过创建之后。你后面就不用创建了,但是你每一次加锁这个就慢了。对吧,啊,所以呢,外面还有一个校验对吧,这样会更快一点,好,那这里面呢,对应的有参数,我们来看一下啊,它并不难对吧?呃,直接点进来看吧。首先。有一个core。核心的尺子数量。呃,那这个是什么意思呢?就是说你看the number of th to keep in,池子里边需要保持的一个现成的数量。
05:05
啊。这什么意思呢?这就是说,比如说我规定了五,那我创建的时候呢,我就五个线程对吧,那最少也得有五个线程,好,那这个。最大的尺子数量,那我们就知道了,假如说你五个不够用了。对吧,我要我数据量很大呀,五个不够用了怎么办?我创建新的。对吧,这最大的好理解吧,好,那关键有个问题,假如说我现在呢,数据量很大,我发现不够用了,我创建了对吧,假如说这个我给他五,这个给了20。好,我发现呢,它不够用了。他不够用了,对吧,那我就创建到20,但是呢,你数据不可能一直在高峰期吧,它肯定会降下来,对吧,那不在高峰期的时候,可能我一五个线程,我可能两个线程就够了,对吧,我维护五个就够了,那接下来你这已经到20了,你不能一直维持最大值啊,所以他要销毁一些现场。
06:02
对吧,那接下来看这两个参数。Keep a lifetime加unit,一个是数字,一个是单位,对吧,比如说五分钟啊,那有如果说超过这个数量。超过了核心尺子数量。空闲了五分钟,这个线程空闲了五分钟,不好意思干掉。销毁掉懂吧,这很好理解,对吧,我不用维持那么多,我高峰期的时候不够,我给你创建就完了呗,对吧?好,那最后一个工作队列,工作列干什么事呢?看啊,呃,队列是用于for holding task,诶,保持这个任务的,对吧?什么时候保持任务呢?Before they are。就是说他们在被执行之前,那放在这个工作队列里边。放在这个工作,也就是说你数据来了对吧,数据来之后呢,先放在工作队列里边,工作队列呢,然后排队,他是个队列嘛,排队去领什么领现场。
07:01
啊,就这意思啊,肩周缓存一下相当于。OK吧,啊,当然呢,当工作队列满了。怎么样,我要开始创建更多的线程了,我要创建更多的这个线程了啊这意思。懂吧。当这个工作队列都满了,排队排不下了,对吧?我要创建更多的线程,直到这个值,直到最大值,它不会超过这个值。然后就工作OK吧,好呃,那这边我们怎么设置呢,一般。前面就是这个啊,比如说我先给一个20对吧,然后呢,后面单位啊,比如说我们保持五分钟对吧,好五。Time unit minutes对吧?啊,假如说我让它保持五分钟,最后呢,要一个这个所谓的队列对吧,那我们用一个。Link的。好,关键的问题在于,最关键的,大家说是哪个,应该是他。
08:02
对吧,最关键的是这个参数,其他参数呢,相对来说都好一点啊,那你这个参数设置为多少呢?生产环境当中大家可能会问,对吧,很简单,因为你想想看啊,我开启四个线程,因为这是核心的,那常常规情况下来说,就四个线程的工作,对吧,我们不能考虑它。是吧,我们就考虑四个线程正常的对吧,就考虑它啊四个线程工作,比如说这个东西怎么来给他生态环境当中,比如说现在呢,你是2000。你生长环境当中,高峰期是2000条每秒。对吧,你呢,一个并行度能处理。100条。每秒。好吧,假如说你一个病因度能处理100条每秒,好,那接下来呢,你有十个病因度,你不就处理1000条每秒嘛,对吧,但是呢,不够啊,它高峰期2000,那我就给什么两三个县长能懂吗?就由你这个值去乘以线程数。
09:07
大于等于它。知道了,因为你的作用不就是提高速度吗?对吧,那你这个线程是多少个,几乎就提高多少倍,但是呢,它如果你四个啊,它其实没有四倍,它比四倍要低一些,因为县城之间是有资源争抢的。对吧,它它比这个呃,多个冰度直接乘还不一样,它要略低一点,假如说你想两倍对吧,你想达到两倍的效果,你可以写个二写写个三或者四。对吧,啊,它不像必路,因为必路是什么是进程。就是不同的Java虚拟机在运行的,在一个独立的slot里边,对吧,你你提高一个并行度之后,它需要一个独立的slot来运行啊,这是不一样的,那我们现在呢,只是一个四到里边开启多个线程,所以呢,你想扩充两倍对吧,你写个三到四,诶你比如说你你想扩充四倍,那五到六你稍微给高一点能明白吗?
10:07
能不能听懂?人呢?只有两个同学,其他同学呢?懵了。傻了啊,多线程啊,怎么又写代码竟然搭出去搞到多线程了?啊,下面那个函数更难啊,我跟你说一声好吧。
我来说两句