java开发有些面试题总是要问的,虽然懂,但是表达确实捉襟见肘。所以说,有时候背也得背过。
1、多线程状态状态哪些?此图必须背过
sleep:静态方法,不会释放锁。让当前正在执行的线程先暂停一定的时间,并进入阻塞状态。
yeid:静态方法,不会释放锁。让一个线程执行了yield()方法后,就会进入Runnable(就绪状态)。
join: 非静态方法,Thread的非静态方法join()让一个线程等待另外一个线程完成才继续执行。
wait: 非静态方法,将当前运行的线程挂起(即让其进入阻塞状态),直到notify或notifyAll方法来唤醒线程。如果有参数wait(long),没有notify或notifAll方法的唤醒,也会自动唤醒。
notify:非静态方法,只要在同一对象上去调用notify/notifyAll方法,就可以唤醒对应对象monitor上等待的线程了
2、jdk8新特性
真的是被问到过好几次,虽然我们在开发的时候使用jdk1.7!!!
1、Lambda表达式
(parameters) -> expression
或者是:(parameters) -> { statements; }
2、新增了四个重要的函数式接口:函数形接口 、供给形接口、消费型接口、判断型接口
3、Stream 接口(容器)配合1、Lambda表达式
4、Optional 类,这是个用来防止NullPointerException异常的辅助类型。
5、新时间日期API 新的日期API都是不可变的,更使用于多线程的使用环境中 LocalDate | LocalTime | LocalDateTime
3、spring IOC DI
此问题被问的吐血了,虽然心里懂,但是说的时候也是一大堆,不是很规整。
IOC:控制反转,反转资源获取的方向。
ApplicationContext代表IOC容器,是一个接口,也可以使用BeanFactory来创建IOC容器,不过常用ApplicationContext.
DI:组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入。
4、redis雪崩和穿透
redis雪崩:同时间大量key过期,简单解决方式:随机1-5分钟key的过期时间
redis穿透:缓存穿透,大量查询查询一个数据库一定不存在的数据,如果数据库数据量大并且是高并发的情况下那么就可能会造成数据库压力过大而崩溃,
这里指的是单个key发生高并发
解决方式:如果从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短,比如设置为60秒
5、对于慢sql如何去优化?
1、表是否对应的查询条件做索引(主键索引,唯一索引,联和索引)
2、查看sql是否关联多表,是否能进行业务逻辑的拆分
3.对于流水日志表是否可以历史分离,例如只查询前1个月的数据
4、数据库主从分离,读写分离,降低读写针对同一表同时的压力。