java中“synchronized” 和“ Lock” 有什么区别

synchronized和Lock在Java多线程中都是用于控制多个线程对共享资源的访问,但它们之间存在多个显著的区别:

1. 本质和类型

  • synchronized:是Java中的一个关键字,属于Java语言层面的一部分,由JVM(Java虚拟机)直接支持。
  • Lock:是Java中的一个接口,位于java.util.concurrent.locks包下,属于JDK层面实现的接口,提供了比synchronized更灵活的锁操作。

2. 加锁方式

  • synchronized:是隐式的加锁,即当线程进入synchronized修饰的方法或代码块时,会自动获取锁,并在方法或代码块执行完毕后自动释放锁。
  • Lock:是显式的加锁,需要手动调用lock()方法来获取锁,并在finally块中调用unlock()方法来释放锁,以确保锁的正确释放。

3. 锁的灵活性

  • synchronized:提供的锁是单一的,无论是可重入锁还是不可中断锁,其特性都是固定的。
  • Lock:提供了比synchronized更灵活的锁操作,如可中断锁、可尝试非阻塞地获取锁、超时获取锁等。此外,Lock还支持公平锁和非公平锁。

4. 锁的粒度

  • synchronized:可以作用于方法上或代码块上,但作用于方法时,锁定的是整个方法,粒度较粗。
  • Lock:只能作用于代码块上,可以更加精细地控制锁的粒度,提高程序的并发性能。

5. 底层实现

  • synchronized:在JVM层面上实现,依赖于对象监视器(Object Monitor)机制。
  • Lock:在JDK层面上实现,通常依赖于AbstractQueuedSynchronizer(AQS)框架。

6. 等待/通知机制

  • synchronized:使用Object类的wait()、notify()和notifyAll()方法进行线程间的通信。
  • Lock:提供了Condition接口,通过Condition的await()、signal()和signalAll()方法进行线程间的通信,这些方法与Object的wait/notify机制相比,提供了更灵活的线程通信控制。

7. 锁的公平性

  • synchronized:只支持非公平锁,即锁的分配是随机的,不保证等待时间最长的线程优先获取锁。
  • Lock:支持公平锁和非公平锁,通过创建ReentrantLock时传入true或false参数来指定。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值