封装、继承、多态
实例方法可直接调用本类的类方法。
实例方法不可直接调用超类的实例方法。
实例方法不可直接调用超类的类方法
实例方法不可直接调用其他类的实例方法
note:
实例方法指必须创建对象,再通过对象进行调用的方法。
超类 = 父类。
子类的实例方法需要通过
super.方法名,对象名.方法名调用父类的实例方法子类的实例方法需要通过
super.方法名,类名.方法名调用父类的静态方法实例方法通过
this.方法名调用本类的实例方法本类的实例方法可以用
类名.方法名,方法名直接调用本类的类方法(静态方法)
重载:同一个名字的方法有不同的版本,如不同的参数列表、不同的返回类型等。
重写:子类对父类方法的重新实现
初始状态(NEW):线程对象刚被创建出来的状态。
运行状态(RUNNABLE):指当前线程可以执行,包括就绪态(ready)和运行中(running)。就绪态指正在等待CPU,运行中指已获得CPU使用权。线程对象创建后,调用了该对象的start()方法即可进入运行态RUNNABLE。
阻塞状态(BLOCKED):线程阻塞于锁
等待(WAITING):睡死了,需要主动唤醒。调用任意已上锁的对象.wait()
超时等待(TIMED_WAITING):可理解为休眠态,指定的时间后自动变为运行态。调用线程对象.sleep()
终止状态(TERMINATED):该线程已经执行完毕。
sleep(int k):休眠k秒,k秒后自动醒来。
线程状态由<运行态RUNNABLE> → <超时等待TIMED_WAITING> → <运行态RUNNABLE>
wait():让线程进入等待。
线程状态由原来的<运行态RUNNABLE>变为<等待WAITING>
sleep() 方法是 Thread 类中的方法,而 wait() 方法是 Object 类中的方法。
sleep() 方法不会释放 lock,但是 wait() 方法会释放,而且会加入到等待队列中。
sleep() 方法不依赖于同步器 synchronized(),但是 wait() 方法 需要依赖 synchronized 关键字。
线程调用 sleep() 之后不需要被唤醒,休眠结束自动恢复(线程的监控状态依然保持)。但是 wait() 方法需要被重新唤醒(不指定时间需要被别人中断)。
A.LinkedHashSet B.TreeSet C.HashSet D.AbstractSet
选B. TreeSet。
TreeSet使用二叉树对元素进行排序。
LinkedHashSet不排序,原来什么就是什么。
HashSet依赖于HashMap,故元素无序。
单例模式时:A对象的创建依赖B对象的创建,B对象的创建又依赖于A对象的创建。
原型:A对象的创建依赖B对象的创建,B对象的创建依赖C对象的创建,C对象的创建又依赖于A对象的创建。
避免构造注入,因为构造注入是死循环无法解决。
思想:设值注入+提前暴露
Spring通过检查Bean容器,查看对应的Bean对象是否已被创建,如果已被创建,则证明存在循环依赖,提前抛出异常。
Mybatis
MybatisPlus
一种缓存中间件
Redis对于Database,就好比内存对于硬盘
Redis主要为了解决大量相同读请求
大量的请求在访问不存在的数据,Redis命中为空,数据库也没有对应数据,数据库查询返回NULL。大量的请求落到数据库,最终导致数据库崩了
- 规则排除。可以增加一些参数检验,如控制查询的数据范围,提前过滤一部分请求
null值填充。- 一级二级缓存法/布隆过滤器。
Redis某个热点Key过期失效,导致大量的请求在访问Redis时命中缺失,这些请求进一步落到数据库,导致数据库崩掉
设置热点Key永不过期
设置锁?
Redis大量的热点Key过期失效,大量请求在Redis缓存命中缺失后,落到了数据库,也会导致数据库崩掉
随机过期时间策略,尽量让缓存失效的时间均匀分布。
设置redis集群和DB集群
cookie
session
JWT:json web token
why出现跨域?
why需要同源策略?
防止恶意网站获取其它网站的资源
防止恶意网站在自已网站有访问其他网站的权利,以免通过cookie免登,拿到数据。
解决方法
一个TCP只能使用一次,意味着每次传输元素对象都要2个RTT,一个用在TCP建立连接,一个用在传输元素对象。
非流水线:一个请求一个响应,必须拿到当前请求的响应才能发生下一个请求
流水线:可连续发送请求
端口号改为443
TLS
短连接(非持久化连接):TCP建立连接后使用一次就断开,见HTTP1.0
长连接(持久化连接):TCP建立连接后可使用多次
黑客通过特定的输入,使得查询语句倾向于
查询检查