线程池
定义:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,对线程统一管理。
线程池就是存放线程的池子,池子里存放了很多可以复用的线程。
创建线程和销毁线程的花销是比较大的(手动new Thread 类),创建和消耗线程的时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程是比较消耗资源的。(我们可以把创建和销毁的线程的过程去掉)。
线程池的优点:
提高效率,创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。
减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
提升系统响应速度,假如创建线程用的时间为T1,执行任务用的时间为T2,销毁线程用的时间为T3,那么使用线程池就免去了T1和T3的时间;
创建线程池的方式:
Executors类(并发包)提供了4种创建线程池方法,这些方法最终都是通过配置ThreadPoolExecutor的不同参数,来达到不同的线程管理效果。
newCacheTreadPool
创建一个可以缓存的线程池,如果线程池长度超过处理需要,可以灵活回收空闲线程,没回收的话就新建线程
newFixedThread
创建一个定长的线程池,可控制最大并发数,超出的线程进行队列等待。
newScheduleThreadPool
可以创建定长的、支持定时任务,周期任务执行。
newSingleExecutor
创建一个单线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
线程的声明周期以及三种阻塞方式
线程有五种状态,创建、就绪、运行、阻塞、死亡。
阻塞分为三种情况:
1、sleep或join造成的阻塞。sleep的阻塞在等待指定时间后,会重新进入就绪状态等待cpu调用。等待期间不会释放锁资源。join则是被强占的线程等待抢占的线程运行结束或者终止后,重新进入就绪状态。
2、同步阻塞。当多个线程想获取同一个锁资源,且锁资源正在被占用的情况下,其他线程会被JVM放入锁池中等待。
3、wait阻塞。wait属于Object类的方法,只能在同步方法或同步代码块中使用。因为wait方法会使该线程释放锁资源,进入阻塞等待状态,只有获取该锁资源的线程调用notify或者notifyAll方法后,该线程才会被唤醒然后转为就绪状态。
双向链表
双向链表是链表的一种,他的每个数据节点前面都有两个指针,分别指向直接前驱和直接后继,所以从双向链表的哪一端开始都可以很方便的访问它的前驱节点和后继节点。
索引的数据结构
数据库索引主要以B数形式存在,B数就是完全二叉树左右平衡的二叉树形式,那么它的查找性能比较快。
Hash结构、二叉树结构等
拦截器
拦截器——SpringMVC
拦截器是在web.xml文件里配置的
拦截器的作用:
SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。
其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”。
当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。
过滤器
过滤器是servlet规范的一部分,任何javaweb工具都能够使用。 过滤器基于回调函数。
过滤器的作用:
在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。
常见的过滤器用途主要包括:对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件、对XML的输出应用XSLT等。
Session加载实体类的过程:
① Session在调用数据库查询功能之前,首先会在一级缓存中通过实体类型和主键进行查找,如果一级缓存查找命中且数据状态合法,则直接返回;
② 如果一级缓存没有命中,接下来Session会在当前NonExists记录(相当于一个查询黑名单,如果出现重复的无效查询可以迅速做出判断,从而提升性能)中进行查找,如果NonExists中存在同样的查询条件,则返回null;
③ 如果一级缓存查询失败则查询二级缓存,如果二级缓存命中则直接返回;
④ 如果之前的查询都未命中,则发出SQL语句,如果查询未发现对应记录则将此次查询添加到Session的NonExists中加以记录,并返回null;
⑤ 根据映射配置和SQL语句得到ResultSet,并创建对应的实体对象;
⑥ 将对象纳入Session(一级缓存)的管理;
⑦ 如果有对应的拦截器,则执行拦截器的onLoad方法;
⑧ 如果开启并设置了要使用二级缓存,则将数据对象纳入二级缓存;
⑨ 返回数据对象。