经过了几个公司的面试,谈谈我这次找工作的面试经历。
工作快五年了,所以给自己定位是找一份Java高级工程师的工作。
由于疫情原因基本都是先电话面试(PS:更多的原因是me在上海,想要找重庆或成都的工作)。
再废话一句,今年真的能不换工作就不换工作吧,因为基本都会被面试官压制。
Java高级工程师的岗位对应聘者的任何一门技术都必须要求知晓其原理,并能够针对性的提出相应的改进方案。经过几轮面试主要总结了以下常见的问题:
一、锁
乐观锁、悲观锁(共享锁(其它名词有读锁、S锁)、排他锁(其它名词有写锁、X锁))的理解和应用,产生死锁的原因有哪些,如何避免死锁。需要了解synchronized与reetrentlock实现原理及区别。
(1)synchronized
实现原理可详见这篇博文《深入理解Java并发之synchronized实现原理》
(2)reetrentlock
本质上采用的是自循锁实现的,在高并发场景下消耗CPU资源较大,性能不如synchronized。
二、事务
(1)Mysql事务隔离级别(read uncommit、read commit、repeatable read、serializable),MySQL默认事务隔离级别repeatable read,见下说明:
①READ_UNCOMMIT(读未提交)
A事务已执行,但未提交;B事务查询到A事务的更新后数据;A事务回滚,出现脏数据,存在脏读、不可重复度、幻读问题;
②READ_COMMIT(读已提交)
在同一个事务中,相同的数据前后获取的信息不一致,存在不可重复读、幻读问题;
③REPEATABLE_READ(可重复读)
它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,理论上也存在幻读问题,MySQL InnoDB默认用了REPEATABLE READ,但可以使用next-key locks解决幻读问题,例如:
select * from user where age>10 lock in share mode;
④SERIALIZABLE(串行化读)
最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
(2)Spring事务传播机制(support、not support、require、require new、mandatory、never、nested)见下说明:
①ROPAGATION_REQUIRED
支持当前事务,假设当前没有事务。就新建一个事务。
②PROPAGATION_SUPPORTS