总结面试中踩过的一些坑
- spring是如何解决循环依赖?
假设A依赖B,B依赖A,代码如下:
假设A先初始化,然后进入到 factory#getBean()方法,spring在执行这个方法时是加了锁(synchroized)的,所以在同一时刻B是无法进入的。
A在 半初始化 完成后开始popular属性B,发现B还未完成初始化,spring再次调用 factory#getBean()完成B的初始化,而B在装载时发现A已经半初始化完成,即使不是成品对象,仍然可以将其注入到属性A中,至此B对象初始化完成,然后回到A的装载阶段,发现B已经初始化完成,将其注入。
解决循环依赖的关键点就是 半初始化。
@Component
public class A{
@Autowired
private B b;
}
@Component
public class B{
@Autowired
private A a;
}
-
HashSet底层实现?
-
HashMap底层实现?
-
spring事务传播机制?
PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
- 调用同一个Thread的start()方法两次会发生什么?
抛出如下错误,原因是每个Thread都有六种状态,除了【可运行状态】与【阻塞状态】可以来回切换,其他状态皆不可逆转。
如第一次调用后,第二次在调用是不能够再次进入到初始状态。
Exception in thread "main" java.lang.IllegalThreadStateException
-
synchroized 和 lock的区别。
-
mysql是如何保证事务的ACID?(指innodb,Myisam不支持事务)
(1) 原子性 A (Atomicity):
利用Innodb的undo log。
undo log名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的sql语句,他需要记录你要回滚的相应日志信息。
(2) 持久性 D (durability):
Mysql是先把磁盘上的数据加载到内存中,在内存中对数据进行修改,再刷回磁盘上。如果此时突然宕机,内存中的数据就会丢失。
(3) 隔离性 I (Isolation):
read uncommitted -> read commited -> repeatable read -> serializable。
(4) 一致性 C (consistence):
通过如上三种来保证最终一致性。 -
eureka怎么做到发布版本不影响前端请求?
-
聊一聊ribbo和eureka的缓存机制?
-
消息中间件如何保证数据不丢失?