lock vs synchronized

三个层面

不同点

  • 语法层面
    • synchronized 是关键字,源码在 jvm 中,用 c++ 语言实现
    • Lock 是接口,源码由 jdk 提供,用 java 语言实现
    • 使用 synchronized 时,退出同步代码块锁会自动释放,而使用 Lock 时,需要手动调用 unlock 方法释放锁
  • 功能层面
    • 二者均属于悲观锁、都具备基本的互斥、同步、锁重入功能
    • Lock 提供了许多 synchronized 不具备的功能,例如获取等待状态、公平锁、可打断、可超时、多条件变量
    • Lock 有适合不同场景的实现,如 ReentrantLock, ReentrantReadWriteLock
  • 性能层面
    • 在没有竞争时,synchronized 做了很多优化,如偏向锁、轻量级锁,性能不赖
    • 在竞争激烈时,Lock 的实现通常会提供更好的性能

公平锁

  • 公平锁的公平体现
    • 已经处在阻塞队列中的线程(不考虑超时)始终都是公平的,先进先出
    • 公平锁是指未处于阻塞队列中的线程来争抢锁,如果队列不为空,则老实到队尾等待
    • 非公平锁是指未处于阻塞队列中的线程来争抢锁,与队列头唤醒的线程去竞争,谁抢到算谁的
  • 公平锁会降低吞吐量,一般不用

条件变量

  • ReentrantLock 中的条件变量功能类似于普通 synchronized 的 wait,notify,用在当线程获得锁后,发现条件不满足时,临时等待的链表结构
  • 与 synchronized 的等待集合不同之处在于,ReentrantLock 中的条件变量可以有多个,可以实现更精细的等待、唤醒控制
### Java 中 `Lock` 接口与 `synchronized` 关键字的区别 #### 功能差异 `synchronized` 是一种内置的关键字,用于提供同步机制来控制多个线程对共享资源的访问。当一个方法或代码块被声明为 `synchronized` 时,在同一时刻只有一个线程能够执行该部分代码[^1]。 相比之下,`Lock` 是显式的锁对象,提供了更灵活和强大的锁定特性。通过实现不同的策略模式,开发者可以根据需求创建自定义锁行为。 #### 使用方式对比 ##### Synchronized 的使用: 对于 `synchronized` 来说,其语法较为简单直接,可以直接应用于方法级别或者作为代码块的一部分: ```java public synchronized void method() { // 同步的方法体 } ``` 也可以在特定范围内应用同步操作: ```java synchronized(this) { // 需要保护的临界区代码 } ``` ##### Lock 的使用: 而 `Lock` 则需要先实例化相应的锁对象再调用相应的方法来进行上锁解锁动作: ```java Lock lock = new ReentrantLock(); lock.lock(); try { // 对受保护的数据结构进行读写操作 } finally { lock.unlock(); } ``` 值得注意的是,这里强调了即使发生异常也要确保释放锁的重要性,因此通常会放在 `finally` 块里处理以防止死锁的发生[^2]。 #### 性能方面考量 由于 `ReentrantLock` 提供了一些额外的功能(比如公平性选项),所以在某些情况下可能会带来一定的性能开销。然而,在大多数实际应用场景下两者之间的差距并不明显,除非是在极高并发度的情况下才会体现出区别[^3]。 #### 特殊功能支持 除了基本的互斥外,基于 AQS(AbstractQueuedSynchronizer) 构建的各种具体类型的锁还允许我们做更多事情,例如条件队列等待通知(`Condition`)等功能都是 `synchronized` 所不具备的优势所在[^4]。 综上所述,虽然二者都能满足多线程环境下的资源共享问题,但在灵活性以及高级特性的支持程度上有显著不同。如果项目中有特殊的需求,则应该优先考虑采用 `Lock` 及其实现类;而对于简单的场景来说,继续沿用传统的 `synchronized` 方式也是完全可以接受的选择。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值