当前位置: 首页 > news >正文

Java全栈面试宝典:锁机制与Spring生命周期深度解析

目录

一、synchronized锁状态机全解析

🔥 问题5:synchronized四态转换与性能对比

锁状态转换流程图

锁特性对比表

CAS操作示例

二、ReentrantLock与synchronized深度对比

🔥 问题6:两大锁机制对比

核心差异矩阵

生产级ReentrantLock示例

三、Spring Bean生命周期与装配机制

🌟 Bean生命周期关键方法

生命周期流程图

关键方法重载示例

🌟 Spring集合注入与自动装配

集合注入示例

自动装配模式对比

四、高频面试题强化训练

1. 如何选择synchronized和ReentrantLock?

2. Bean生命周期回调执行顺序?

3. 自动装配的歧义性如何解决?


一、synchronized锁状态机全解析

🔥 问题5:synchronized四态转换与性能对比

锁状态转换流程图

锁特性对比表
锁类型优点缺点适用场景JVM参数
偏向锁无CAS开销,单线程零成本撤销需要暂停线程单线程独占场景-XX:+UseBiasedLocking
轻量级锁线程不阻塞,响应快自旋消耗CPU低竞争短同步默认启用
重量级锁不消耗CPU线程切换开销大高竞争长同步默认启用
CAS操作示例
// 轻量级锁获取伪代码
void enterLightweightLock() {
    MarkWord mark = object.markWord;
    if (mark.isNeutral()) { // 无锁状态
        LockRecord lockRecord = thread.stack.createLockRecord();
        lockRecord.displacedHeader = mark;
        if (CAS(object.markWord, mark, lockRecord.address)) {
            return; // 获取成功
        }
    }
    // 升级为重量级锁
    inflateLock();
}

二、ReentrantLock与synchronized深度对比

🔥 问题6:两大锁机制对比

核心差异矩阵
维度synchronizedReentrantLock
实现级别JVM关键字JDK类实现
锁公平性非公平可选公平/非公平
条件队列单队列多Condition
中断响应不支持lockInterruptibly()
锁绑定自动释放必须手动unlock()
性能优化后接近高竞争更优
生产级ReentrantLock示例
public class BoundedBuffer {
    private final ReentrantLock lock = new ReentrantLock(true); // 公平锁
    private final Condition notFull = lock.newCondition();
    private final Condition notEmpty = lock.newCondition();
    private final Object[] items = new Object[100];
    
    public void put(Object x) throws InterruptedException {
        lock.lock();
        try {
            while (count == items.length)
                notFull.await();
            items[count++] = x;
            notEmpty.signal();
        } finally {
            lock.unlock();
        }
    }
}

三、Spring Bean生命周期与装配机制

🌟 Bean生命周期关键方法

生命周期流程图

关键方法重载示例
public class LifecycleBean implements 
    BeanNameAware, InitializingBean, DisposableBean {
    
    @Override
    public void setBeanName(String name) {
        System.out.println("3. BeanName回调: " + name);
    }
    
    @PostConstruct
    public void postConstruct() {
        System.out.println("5. @PostConstruct");
    }
    
    @Override
    public void afterPropertiesSet() {
        System.out.println("6. InitializingBean");
    }
    
    public void customInit() {
        System.out.println("7. 自定义init");
    }
    
    @PreDestroy
    public void preDestroy() {
        System.out.println("8. @PreDestroy");
    }
    
    @Override
    public void destroy() {
        System.out.println("9. DisposableBean");
    }
    
    public void customDestroy() {
        System.out.println("10. 自定义destroy");
    }
}

🌟 Spring集合注入与自动装配

集合注入示例
<bean id="complexObject" class="com.example.ComplexObject">
    <property name="list">
        <list>
            <value>Java</value>
            <ref bean="springBean"/>
        </list>
    </property>
    <property name="map">
        <map>
            <entry key="key1" value="value1"/>
            <entry key="key2" value-ref="springBean"/>
        </map>
    </property>
</bean>

运行 HTML

自动装配模式对比
模式说明注解示例
byType按类型匹配@Autowired
byName按名称匹配@Resource
constructor构造器参数匹配构造器参数上的@Autowired
no默认不自动装配-

四、高频面试题强化训练

1. 如何选择synchronized和ReentrantLock?

  • 选择synchronized:简单同步场景、追求代码简洁性

  • 选择ReentrantLock:需要公平锁、可中断锁、超时锁、条件队列等高级特性

2. Bean生命周期回调执行顺序?

  1. 构造函数

  2. @Autowired注入

  3. @PostConstruct

  4. InitializingBean.afterPropertiesSet()

  5. 自定义init-method

  6. @PreDestroy

  7. DisposableBean.destroy()

  8. 自定义destroy-method

3. 自动装配的歧义性如何解决?

@Autowired
@Qualifier("mainDataSource")
private DataSource dataSource;

// 或使用JSR-250
@Resource(name="mainDataSource")
private DataSource dataSource;

实战建议

  1. 使用jstack工具分析锁竞争情况

  2. 通过@Order控制Bean初始化顺序

  3. 使用@Lazy延迟初始化解决复杂依赖

💬 你在项目中遇到过哪些锁性能问题?如何优化的?
🎁 关注+转发,抽送《Java并发编程实战》电子书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/115901.html

相关文章:

  • edge webview2 runtime跟Edge浏览器软件安装包双击无反应解决方法
  • 探秘JVM内部
  • 流浪动物救助|基于Springboot+vue的流浪动物救助平台设计与实现(源码+数据库+文档)
  • 如何单独指定 Android SDK tools 的 monitor.bat 使用特定 JDK 版本
  • 论伺服电机在轨道式巡检机器人中的优势及应用实践​
  • 《QT从基础到进阶·七十四》Qt+C++开发一个python编译器,能够编写,运行python程序改进版
  • AIDD-深度学习 MetDeeCINE 破译代谢调控机制
  • 达芬奇预设:复古16mm胶片质感老式电影放映机转场过渡+音效
  • 《C++后端开发最全面试题-从入门到Offer》目录
  • WEB安全--XSS--XSS基础
  • ②(PROFINET 转 Modbus TCP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
  • 【Linux系统篇】:探索文件系统原理--硬件磁盘、文件系统与链接的“三体宇宙”
  • Deepresearch的MCP实践
  • 接上文,SpringBoot的线程池配置以及JVM监控
  • 初探:简道云平台架构及原理
  • 创建HAL版本MDK工程模板
  • 游戏引擎学习第199天
  • 如何访问和使用Sora:OpenAI视频生成模型的完整指南
  • 修改jar包里面的文件方法
  • WEB安全--内网渗透--LMNTLM基础
  • pom导包成功,但是就是无法使用相关类,同时报错:Library:Maven ‘xxx‘ has broken path
  • 【ESP32】ESP32物联网应用:MQTT控制与状态监测
  • SPSS系列1—无聊的列联表卡方检验
  • 【4】数据结构的循环链表章
  • MySQL 存储过程的实用技巧与最佳实践
  • Business English Certificates (BEC) 高频词汇背诵
  • 【C / C++】蓝桥第27场月赛
  • vue2 vue3 响应式差异
  • Android NDK C/C++交叉编译脚本
  • c++使用gstreamer录屏+声音