java面试题40synchronized和lock的区别?

在 Java 并发编程中,synchronizedLock(通常指 ReentrantLock)是两种不同的线程同步机制,它们在实现方式、功能和性能上有显著区别:


🧱 核心区别总结

特性 synchronized Lock (ReentrantLock)
实现级别 JVM 原生关键字(字节码指令) JDK API 接口(Java 类实现)
锁释放 自动释放(代码块结束/异常) 必须手动 unlock()(否则死锁)
锁获取方式 阻塞式(不可中断) 可轮询/定时/中断获取
公平性 非公平锁(默认) 可选公平/非公平锁
条件变量 单一等待队列(wait/notify 支持多个条件队列(Condition
性能 优化后接近 Lock(JDK6+) 高竞争场景下更优
锁绑定 与对象关联 灵活绑定任意资源

🔧 详细对比

1. 实现机制
  • synchronized
    • JVM 层面通过 monitorenter/monitorexit 字节码指令实现
    • 锁状态记录在对象头的 Mark Word 中
  • Lock
    • Java API 实现(如 ReentrantLock 基于 AQS 队列)
    • 通过 CAS 操作和 volatile 变量管理锁状态
2. 锁获取与释放
操作 synchronized Lock
获取锁 进入同步块自动获取 lock.lock() 手动调用
释放锁 退出同步块自动释放 必须 try-finally 中调用 unlock()
示例代码 synchronized(obj) { ... } lock.lock(); try{...} finally{ lock.unlock(); }
3. 高级功能对比
🔄 锁中断
  • synchronized
    • 线程阻塞时不可中断(可能永久等待)
    synchronized(lock) {
         
         
        lock.wait(); // 等待过程不可中断
    }
    
  • Lock
    • 支持可中断获取锁:lock.lockInterruptibly()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值