多线程面试题
1、为什么要使用多线程?
提高效率。
2、项目中那些地方用到了多线程。
- 多线程的下载技术。同时下载多个视频
- 异步发送短信。报案成功后会保存相关的案件数据并发送短信。保存数据3S,发短信3S,如果用了多线程,同时进行,可以节约三秒钟。
- 异步回调中,采用多线程技术相应给支付接口。
- AOP异步记录项目日志 --》 拦截方法写日志2秒,再执行业务2秒。导致消耗大量时间,此时可以采用异步编写日志的方法,来处理日志。
3、多线程的问题
- 共享同一个全局变量,可能会被其他线程干扰,影响线程安全问题
- 出现程序死锁问题:可以使用lock锁或者synchronize同步代码块解决。
程序死锁后可以通过控制台的日志查看是否有死锁现象,有的话手动将此线程停掉。
4、有用过线程池吗,什么时候用到?
- 复用我们的线程,减少频繁地创建和调用start()方法。
- 提高程序的效率,减少CPU的调度。
- 统一管理维护我们的线程。
如果频繁创建Thread,调用start()方法,对我们的线程消耗会非常大,需要考虑到多线程的复用机制。线程池。
复用的思路:但我们调用一个线程执行结束后,不会停止线程而是继续复用,执行下一个任务。
HashMap和HashTable
key 可以存对象(String 就是对象)。
Map特征:基于key - value,基于key查到value
HashMap | HashTable |
线性不安全,效率较高 | 安全,synchronize上锁,效率较低,项目中可以用ConcurrentHashMap操作 |
key value 可存null,如果同时为空,hahscode=0 | 不能存null |
Redis面试题:
1、项目中有没有用到redis?
2、redis有哪些数据结构?
3、redis的应用场景?
1)Token令牌生成
2)短信验证码code,设置有效期
3)使用redis减轻数据库访问的压力。(经常查询且很少修改,预热,热点key)
4)网页计数器。(浏览量) --》单线程保证原子性。
5)订单30分钟有效期:使用redis的key的有效期。
4、是否线程安全?
redis单线程,所以线程安全。
5、单线程效率为何高?
核心就是io多路复用原则;数据存放在内存上;redis官方不支持windows版本
6、如何存放对象?
存放json,存放二进制(不能跨语言,只能java用)
7、redis中是否有事务机制?是否支持回滚?
支持事务:Multi 、Watch
Redis没有行锁,两个是同可以同时对一个key操作。在redis中就i算加了事务,也没效果。难以保证原子性。
Watch 采用redis的乐观锁机制进行处理。 对版本号进行判断
不支持回滚。只是支持事务的取消。
8、redis有发布订阅的吗?
9、redis如何与数据库保持一致性?
1)直接清空redis,再同步数据库。low
2)订阅数据库的binlog文件,通过消息中间件同步数据库的数据。
10、redis宕机后,数据会丢失吗
不会,数据可以持久化。
11、持久化的机制
rdb:全量同步,所有数据放入xxx.rdb文件中,定时性,多少秒进行了多少次操作,满足条件才会持久化。
aof:最多会丢失1s的数据,数据丢失无所谓,因为还有数据库。 增量同步,将set等操作同步到aof文件中,效率较低。
12、增量同步与全量同步的区别
13、订单30分钟超时,如何自动取消
14、redis内存满了如何解决
1)内存扩容。
2)对不经常使用的key提前释放。