常见面试题
# Synchronized
# ❓执行wait()之后锁是什么状态?执行notify()之后锁又是什么状态?
✅ 答案:执行wait()之后线程是挂起状态,需要依托操作系统,所以锁升级为重量级锁
执行notify()之后线程唤醒,进入轻量级锁
# ❓synchronized重量级锁执行完毕和轻量级锁执行完毕,对象锁是什么状态?
✅ 答案:因为同步块执行完毕,所以此时资源不存在锁竞争,进入无锁状态,把原本指向栈帧中锁记录的指针指向对象hashCode复制到无锁状态
# ❓synchronized偏向锁执行完毕,对象锁是什么状态?
✅ 答案:还是偏向锁状态,因为偏向锁没有存储对象hashCode,无法复制hashCode到无锁状态
# ❓synchronized什么情况下会升级为重量级锁?
✅ 答案:轻量级锁竞争激烈的状态下会升级重量级,竞争激烈一般指的是通过CAS在轻量级锁竞争过程中没有抢占到锁资源,此时锁状态会升级为重量级锁
# ❓无锁状态下如果在synchronized中调用对象hashCode会升级为重量级锁吗?
✅ 答案:是的,当对象进入重量级锁的时候,hashcode就会转移到monitor中,在monitor中有字段可以记录markword,所以hashcode自然也是在这里面
# HashMap
# ❓ConcurrentHashMap协助扩容最大线程数支持是多少?
✅ 答案:65535
源码:
private static int RESIZE_STAMP_BITS = 16;
/**
* The maximum number of threads that can help resize.
* Must fit in 32 - RESIZE_STAMP_BITS bits.
* 可以帮助调整大小的最大线程数。必须在32 - RESIZE_STAMP_BITS位
*/
private static final int MAX_RESIZERS = (1 << (32 - RESIZE_STAMP_BITS)) - 1;
ps:(1<<(32-16))-1 = 65535
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# ❓ConcurrentHashMap扩容为何是的两倍?
✅答案:为了提升散列算法(&与运算)的计算效率;减少hash碰撞;减少扩容时元素的位置移动
# Redis
# ❓Redis过期key删除策略有哪些?
✅答案:
- 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
- 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
- 当前已用内存超过maxmemory限定时,触发主动清理策略
# Spring
❓描述下BeanFactory?
❓BeanFactory和ApplicationContext的区别?
❓简述SpringIoC的加载过程?
❓简述Bean的生命周期?
❓Spring中有哪些扩展接口及调用时机?
上次更新: 2025/01/13, 10:51:06