java面试题合集(1)

总结面试中踩过的一些坑

  1. 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;
}
  1. HashSet底层实现?

  2. HashMap底层实现?

  3. spring事务传播机制?


PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
  1. 调用同一个Thread的start()方法两次会发生什么?

在这里插入图片描述

抛出如下错误,原因是每个Thread都有六种状态,除了【可运行状态】与【阻塞状态】可以来回切换,其他状态皆不可逆转。
如第一次调用后,第二次在调用是不能够再次进入到初始状态。

Exception in thread "main" java.lang.IllegalThreadStateException
  1. synchroized 和 lock的区别。

  2. 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):
    通过如上三种来保证最终一致性。

  3. eureka怎么做到发布版本不影响前端请求?

  4. 聊一聊ribbo和eureka的缓存机制?

  5. 消息中间件如何保证数据不丢失?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值