原文链接
算法 leetcode
数据结构
平衡二叉树,红黑树,哈希表,堆,捅,图,这些结构用数组和链表的方式分别去创造下,自己实现下,增量因子设置多大,为什么要那么大什么的破烂问题也要关注。
计算机网络
这个搞懂几个层是啥,TCP/IP的三次握手,四次挥手过程,为什么要这样设计,抓包怎么抓,基本还好了。
操作系统
《操作系统――精髓与设计原理》
内存分配、调度、进程、线程这几个点,着重理解下
数据库
会写sql,几大范式定义概念搞懂,
数据库事务的ACID
隔离层级分别保障的粒度,和依然存在的问题
你得知道sql得优化和套路。查询优化策略,db层级的优化考虑你是大学生,不太会问题。
MYSQL的存储引擎之间的区别,你得知道吧。
索引,索引原理,索引数据结构与算法,为什么会采用这些索引?索引优缺点。
数据库事务的实现方式你能知道一些吗?二阶段提交、三阶段提交你知道不?看你个人深浅了。
java的一些知识点
1.集合方面
map,set,list的区别概念
具体的实现类简单点的就HashMap HashSet ArrayList
看你能扯多少,要是能行的话我们换点稍微有意思的话题HashTable,CurrentHashMap,TreeSet,LinkedHashSet,LinkedArrayList,BlockingQueue及其各种实现看你能掰扯几分了?
2.IO方面:
BIO\NIO\AIO你有能知道多少呢?这个话题可就多了也见深浅了,话题也开放了。
基本的IO操作,到实现机制、设计模式乃至操作系统的各种调度我都可以和你聊一聊,也顺便可以和你扯一扯mina,netty,Grizzly,听没听过,玩没玩耍过,相信很快能摸出你的深浅。
3.多线程:
你以为这个你能跑得掉?线程的生命周期,同步异步的区别,什么时候需要同步,什么时候需要异步,线程的调度方式,聊聊并发编程,为啥要并发,怎么去并发,你处理了哪些并发问题,你能没经验,不过没关系,问问还是可以的。
4.虚拟机的那些事儿:
JVM的内存模型,垃圾回收机制,各种机制下的垃圾回收器怎么工作还是知晓些吧。
5.一些基本的东西你还是要有吧
http协议、https协议,dns解析过程、servlet是个什么东西?生命周期如何?request/response区别,session/cookie区别实现机制,redirect/forward的区别你能给简单讲讲?
6.编程框架:
web类的框架执行流程总得讲一下吧,比如SpringMVC是如何工作的?你自己实现个web框架可以还是不可以?怎么做,可有思路?既然是Spring了那么IOC\AOP的实现原理怎么来的,bean的作用域有哪些,务传播机制,隔离层级,基本还是要问问的?反射,代理怎么回事不可能搞不清楚吧。代理的几种方式JDK的cglib的aspectJ的,你又只多少?抛弃了框架你自己实现基于类的代理有门么?mybatis听过没?不管你听没听过反正jdbc那些事情,数据库连接池的那些事情,我们有得聊,只要你能勾起我们的聊天兴趣。
7.通用性质的一些东西:
大名鼎鼎的apache你知道吗?web服务器,应用服务器类的区别你知道吗?ngnix玩耍过没?ngnix你都用来干了些什么?缓存可有听过?怎么来玩耍?从浏览器端一直到后端的各层缓存该怎么来玩耍?策略又是如何来定的?分布式缓存可有听过?memcached,redis可有玩耍过总之话题很多,不一而足。
8.分布式的一些概念:
你可知晓为啥要分布式?分布式有哪些经典问题?简单点的如何实现应用无状态,全局唯一ID(莫要拿什么雪花算法之类的烂大街的来扯,要有点实际意义的),负载均衡有没有概念?如何做?如何去做高可用?如何去保障分布式环境下的一致性问题?消息中间件玩耍过没有?知不知道都有哪些,实现区别在哪里,用它干嘛去?分布式的环境下如何去保障服务的可靠性?如何面临雪崩问题?如何面临穿透问题?包括但不限于spring cloud的相关话题,都解决了哪些分布式方面性的问题,如何解决的,策略有哪些?问题多的是,看你有多少深浅了。
当然,你的脑袋也不要死,不能僵硬,再卖你点套路性的问题——给你一个大文件里面全是数字如何去完成排序?很多人会想到归并排序,各种算法各种结构,这些都没啥问题,都是基本分,有没有想到这个文件怎么读、怎么写,读到哪里,写道哪里,你就没想过读取后写到不同的机器,然后不同的机器跑一样的算法然后合并结果,最后输出?对的,这个问题能想到后面的,至少你可能了解分布式文件系统的套路和思想——hadoop,hbase,hive,我们看看小伙姑娘功夫咋样,是不是真有货,是不是真有潜力?
数据库:
会写sql,几大范式定义概念搞懂,
数据库事务的ACID
隔离层级分别保障的粒度,和依然存在的问题
你得知道sql得优化和套路。查询优化策略,db层级的优化考虑你是大学生,不太会问题。
MYSQL的存储引擎之间的区别,你得知道吧。
索引,索引原理,索引数据结构与算法,为什么会采用这些索引?索引优缺点。
数据库事务的实现方式你能知道一些吗?二阶段提交、三阶段提交你知道不?看你个人深浅了。
数据库三大范式通俗理解
1.三大范式: 范式:设计数据库的指导方法。
eg: 学生表,学号:主键; 字段:姓名。
- 属性不可分割,每个字段都是不可再拆分的。比如姓名,国内默认不可再分割,但国外还有First Name,Last Name,这时候,姓名就不符合第一范式了。但也要看需求,设计目标而定。
- 主键约束,表中要有主键,其他字段都与主键相关。例如学生表,主键是值唯一的学号,其他所有字段都可以根据这个学号去获取,因为主键是唯一的,不会出现信息乱放的情况。
- 外键关联,表中不能有其他表中存储的相同信息的字段,消除冗余,通常通过外键关联。比如学生表,有学号,姓名等字段,要把他的系编号,班主任也存到表中,就会造成数据的大量冗余;一是这些信息已经在系表中存储;二是如果系有1000个学生,这些信息就要存储1000遍;应该加一个系编号的字段作为外键,与系信息表关联。
2.数据库事务的ACID
eg: 张三转100元给李四这个事务。张三的账户减100元,李四的账户加100元
- A: 原子性,要么全都执行,要么全都不执行。
- C: 一致性,事务执行前后,数据库都保持一致性。一致性指:符合真实世界的状态。比如两个用户的总金额是不会改变的,这个总金额就要满足事务执行前后的一致性,那么事务执行前后,两个用户总金额是一致的;举个不一致的情况:如数据库发生故障,事务没有完成就中断,张三账户减少了100元,李四账户还没增加100元,总金额和事务执行前不一致。
- I: 隔离性,事务之间操作的数据之间隔离。分四种隔离级别:读未提交,读已提交,可重复读,串行化。
- D:持久性,提交的事务对数据库的更新时持久的。任何事务或系统故障都不会导致数据丢失。
3.隔离层级分别保障的粒度,和依然存在的问题
eg: 事务A:x = 0, x增加100次,x = 100时,提交。
事务B:读取x的值。
4.sql得优化和套路,查询优化策略
5.MYSQL的存储引擎之间的区别
6.索引原理,索引数据结构与算法,为什么会采用这些索引?索引优缺点。
7.数据库事务的实现方式
8.二阶段提交、三阶段提交
集合
map,set,list
HashMap HashSet ArrayList
HashTable,CurrentHashMap,TreeSet,LinkedHashSet,LinkedArrayList,BlockingQueue,CopyOnWriteArrayList
CopyOnWriteArrayList
- 引入初衷:ArrayList不是线程安全的,加synchronized锁,线程读写都会阻塞其他线程,效率低;而大多数业务场景是读多写少,如配置文件,使用读写锁,读锁被占用时,读操作不会被阻塞,阻塞写操作;使用读锁时,读写操作都会被阻塞,即读数据一定会读到最新值。我们想,读操作在任何时候都不会被阻塞,牺牲读新数据的实时性,换取效率
- COW(Copy-On-Write)设计思想:
多线程
多线程:
线程的生命周期,
同步异步的区别,什么时候需要同步,什么时候需要异步,
线程的调度方式,
聊聊并发编程,为啥要并发,怎么去并发,你处理了哪些并发问题,
多线程:
1.线程的生命周期 更加详细资料
-
新建:new
-
就绪:就绪,start后,等待分配CPU资源
-
运行:获得CPU资源
-
阻塞:如sleep(), wait()后,需要notify()唤醒;抢锁,需要等待锁释放;等待同步IO操作,需要等待IO操作完成;线程被阻塞,等待CPU资源分配再次执行。
-
死亡:线程正常执行完毕或被提前强制终止,线程被销毁,释放资源。
-
扩展知识点
-
sleep和wait
-
sleep:只是交出CPU时间片,如再次获得CPU时间片会继续执行。
-
wait:释放锁,所以必须在同步方法会块中使用,必须等待Object.notift/Object.notifyAll通知后,才会离开等待池,获得CPU时间片会继续执行。
-
守护线程,用户线程
-
守护线程当用户进程结束后,会自然退出。
2.同步异步的区别,什么时候需要同步,什么时候需要异步
-
同步异步的区别, 通常形容一次方法调用:
- 同步:调用一个方法后,需要等待这个方法执行完成后,再能去做别的事情
- 异步:调用一个方法后,不需要等待这个方法执行完,就可以去做别的事情
-
扩充:阻塞和非阻塞
-
一般针对多线程相互影响,当一个线程操作共享资源时,其他线程被阻塞,必须等待线程释放资源,如写锁。
-
当一个线程操作共享资源,其他线程不会被阻塞,如读锁。
3.线程的调度方式
4.聊聊并发编程,为啥要并发,怎么去并发,你处理了哪些并发问题
为啥要并发
-
充分利用多核CPU的计算能力
- eg: 在多核CPU下执行计算密集型任务,如加密解密,数据压缩,如果使用单线程,就只有一个核满载,其他核心都闲置了。
-
方便业务拆分,提升应用性能。
- eg: 复杂业务,往上购物,拆分成减库存,生成订单等操作,多线程去执行。
-
扩充知识点 原文链接:对于多线程程序,单核CPU与多核CPU是怎么工作的?
对于多线程程序,单核CPU与多核CPU是怎么工作的? -
单核多线程,并发:
- 同一时间,只有一个线程在跑,系统帮忙切换线程而已。单核CPU使用多线程:通常是由线程要处于等待状态,如IO密集型任务。如果是计算密集型任务,多线程反而要上下文切换。
-
多核多线程,并行:
- 线程越多越好吗?不是,线程切换也要开销,增加的开销小于该线程能够消除的CPU阻塞时间,才物有所值。
-
多核CPU,计算密集型任务。如加密解密,数据压缩,此时尽量使用多线程,可以提高执行效率;如果是单线程,只能是一个核心满载,而其他核心闲置。
-
单核CPU,计算密集任务。此时CPU已经满载了,没必要多线程。如果要做人机交互,还是多线程,避免用户没有办法对计算机操作。
-
单核CPU,IO密集型,使用多线程,提高CPU利用率,方便人机交互。
-
多核CPU,IO密集型,使用多线程,提高CPU利用率,方便人机交互。
-
并发缺点
- 频繁上下文切换
- 如何优化:无锁并发编程,分段锁,CAS,在多线程竞争下,减少上下文切换。
- 线程安全,死锁
- eg:线程1获取了锁A去操作资源A,想要再去获取锁B去操作资源B。此时,线程2获取了锁B去操作资源B,想要再次去获取锁A去操作资源A,双方僵持,互相等着对方释放锁。处于死锁。
- 如何避免死锁:
- 避免一个线程获得多个锁;
- 尝试使用定时锁,lock.tryLock(timeOut),当超时等待当前线程不会在阻塞。
- 频繁上下文切换
怎么去并发?
多线程,
工作内存,主内存
你处理了哪些并发问题?