查漏补缺第一弹
-
equals == hashcode
首先 == 比较的是值,基本类型比较的是值,引用类型比较的是地址。
equals 和 hashcode的关系。
equals可以重写,可以根据我们的业务需求返回结果,一般重写equals就必须重写hashcode()。流程是,先比较hashcode(),如果结果相同再去比较equals(),如果两个都相同就是发生冲突。我们不希望出现equals()结果相同,hashcode()结果不同的情况。 -
ThreadLocal的原理
- ThreadLocal出现,是为了保证每一个线程都有一个变量的副本,实现数据的隔离。每一个线程都有ThreadLocalMap,里面存放着变量副本。
ThreadLocal vs Synchronized - ThreadLocal本质上,是为了每一个线程创建了一个数据的副本,所以多线程在同一时间段内,访问的变量是不同的。而Synchroniezd是通过锁的机制实现了数据的共享,在同一个时间段内,多个线程访问的变量是相同的,这就是两者最本质的区别。
- ThreadLocal在我眼中是用空间换时间,而Synchronized是用时间换空间。
- ThreadLocal出现,是为了保证每一个线程都有一个变量的副本,实现数据的隔离。每一个线程都有ThreadLocalMap,里面存放着变量副本。
-
I/O模型大讲解
在这里讲解一下:同步和异步的区别。同步是指A调用B,B完成一系列操作后,回应A。而异步是指,A调用B,B先返回给A告诉请求已经收到,再去处理A的请求,最后通过回调函数的方法通知A结果。- BIO模型:同步阻塞模型,进程/线程发起IO请求之后,一直阻塞自身,等到数据准备好,再读取数据。
- NIO模型:同步不阻塞模型:发起IO请求后,不阻塞自身,会不断询问CPU自身的数据是否准备好,准备好再读取数据。
- I/O多路复用:所有的IO请求被注册到一个选择器中,选择器会定期去查看是否有数据准备好,准备好就让对应的进程读取数据。
- 异步IO:进程发起IO请求,等到数据准备好通知发起请求的进程,进程读取数据。
-
notify()底层原理
说notify()就必须搭配wait()一起说。wait()和sleep()不同,sleep是不释放锁资源的,而wait是释放锁资源的。只有占有锁资源的线程才可以wait,将自身的waitset设置成waiting状态。通过notify(),可以将waitset为waiting状态的线程唤醒,重新加入锁资源竞争的队列。 -
Mysql慢查询优化思路,通过log定位到执行慢的SQL语句,通过explain观察SQL是否可以优化。
- SQL优化的思路:索引是否设置的合理(比如where条件的字段是否添加了索引,添加索引字段的区分度大不大等),索引是否失效了。
- 用between替换in
- 用批量插入的insert代替单挑插入的Insert
-
hashmap扩容算法的时间复杂度为O(n)。
-
TLS四次握手
HTTPS就是在HTTP和TCP之间加了一层TLS四次握手,作为加密- 第一次握手:客户端发送:1. 一个随机数client-random。2. 支持的TLS版本。3. 支持的密码套件列表。
- 第二次握手:服务端收到客户端发送的信息,确认好支持的版本号,选择一个密码套件,发送一个随机数server-random,和数字证书。
- 第三次握手:客户端验证数字证书的正确性,再生成一个随机数pre-master通过公钥加密发送给服务端,双方再通过pre-master生成一个对称密钥,之后的通信通过这个密钥加密。客户端发送通过这个密钥加密的一个摘要
- 服务端同理,拿到pre-master之后,也是生成一个摘要发送给客户端。两边确认没有问题之后,就可以开始发送数据了。
-
Mysql的最左匹配原则。比如Mysql创建了索引 key idx_abc(a,b,c),相当于创建了索引a ,(a,b),(a,b,c)。
-
java中实现同步的几个方法
- Sychronized + notify + wait
- ReentrantLocal + Conditional
- Semaphore信号量
-
Mysql的主键要求严格自增吗。
首先,Mysql的主键是要求自增的。因为B+树作为索引的数据结构,如果主键不是自增的,就会插入数据的时候就必须去寻找合数的位置,而插入的是自增的数据,只需要在末尾插入数据即可。
其次,建议主键所对应的字段越小越好,因为Innodb非聚餐索引第叶子节点存放的是主键对应的列。如果主键对应的列太大会占据较多的空间。 -
UDP可靠传输的思路:在应用层,模拟seq/ack机制、超时重传机制等。
-
HashMap的线程安全思路:1. 使用HashTable。2. 使用CurrentHashMap。3. 使用Collection.sychronizedHashMap方法放回线程安全的HashMap.
-
Token、Session、Cookie:
- Session:当客户端发起请求,服务器就针对客户端的请求,在自身生成一个session记录,给客户端发一个sessionId,当下次客户端再次访问的时候,携带这个sessionId即可。但是会造成服务器压力过大的问题。
- Cookie:只有浏览器能用,数据存放在客户端这一方面,用户请求携带cookie,服务器就直接验证。一般来说Cookie和Session一起使用。
- Token:是为了缓解Session的服务器压力过大的问题。通过加密算法生成令牌发给用户,用户请求时携带令牌即可。但是会造成一个问题CPU压力过大。
- JWT就是一个生成Token的方法,数据传输的时候会通过base64加密。
- Header
- playload
- signature
-
AQS的原理
核心思想,空闲让进,忙则等待。- 采用了FIFO思想,维护了一个voliate修饰的state变量和一个CLH队列。state = 0,表示资源空闲可以放进,如果state=1,表示资源不空闲,这个时候就提取信息变成一个node加入CLH队列了,这个队列是先进先出的。
-
Atomic原子类底层通过:CAS操作+自旋保证正确性。
-
类加载机制
- 加载,将.class文件加载进入内存,生成一个class对象
- 验证,验证class对象是否正确,会有类似语法的校验、文件格式的校验
- 准备,将static修饰的变量赋值,这个赋值赋的是默认值,而不是人为定义的值
- 解析,将符号引用变成直接引用
- 初始化,static修饰的变量替换成人为定义的值
-
minor gc与full gc的联系
所谓的空间担保机制。在发生minor gc的时候,会先使用空间担保机制,保证老年代有足够的空间去装载本次会进入老年代的对象。如果没有就会发生full gc。 -
双亲委派机制
- 当一个类加载器接受到一个类加载的请求的时候,会委派给自己的父类进行类的加载,当父类不能加载的时候会一级一级委派给子类加载器加载。
- 优点:避免加载同一个类、防止修改Java中的类
-
Innodb和myisam的区别
- Innodb支持事务而Myisam不支持
- Innodb支持行锁而Myisam不支持
- Innodb支持外键而Myisam不支持
20 Mysql中的锁 - 全局锁:锁住的是数据库中的所有表
- 表锁:
- 意向锁:分为意向排它锁和意向共享锁。主要目的是为了减少加表锁的时候对行锁的校验。
- 独占写锁
- 共享读锁
- 行锁:
- 记录锁
- 排它锁
- 共享锁
- 间隙锁
- 记录锁+间隙锁 解决幻读问题
- 记录锁
-
指令指的是,源码与指令执行的顺序不一致,但是结果一致,在单线程中没有问题,在多线程可能引发问题
-
当进程切换到内核态是发生了系统调用
-
CPU的上下文切换是指:
- 保存上一个进程的现场,程序计数器,寄存器的数据等等存放到进程的内核空间
- 加载新进程的程序计数器,寄存器信息等
- 执行指令
OS在分配虚拟内存的时候,给地址划分了内核去和用户区域,上下文存在内核区这一块儿