多线程面试题

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提前释放。