详细说说synchronized和Lock有什么区别

Java面试 潘老师 8个月前 (09-04) 171 ℃ (0) 扫码查看

Java面试题:详细说说synchronized和Lock有什么区别?

得分点:

使用方式、主要特性、实现机制

标准回答:

synchronizedLock都是用于线程同步的工具,它们之间的区别主要表现在以下三个方面:

使用方式的区别

  • synchronized关键字可以作用在静态方法、实例方法和代码块上,它是一种隐式锁,不需要显式地获取和释放锁,因此使用起来非常方便。在synchronized同步模式下,线程通信依赖于Monitor(同步监视器)。
  • Lock接口是一种显式锁,使用时需要显式地调用其内部定义的方法来加锁和解锁。在Lock同步模式下,线程通信依赖于Condition对象,它是由Lock对象创建的,每个Condition代表一个等待队列。相对于synchronizedLock提供了更大的灵活性。

主要特性的区别

  • synchronized是较早的API,功能相对较简单,主要用于基本的线程同步。它没有提供一些高级特性。
  • Lock是在JDK 1.5引入的,相对于synchronized,它新增了一些功能特性,包括:
    • 可中断地获取锁:允许线程在等待锁的过程中被中断。
    • 非阻塞地获取锁:立即返回,成功获取锁返回true,否则返回false
    • 可超时地获取锁:等待一段时间后,如果仍未获取到锁,可以返回false

实现机制的区别

  • synchronized的底层是基于Java对象头来存储锁信息的。对象头包含Mark Word(标记字)、Class Metadata Address(类元数据地址)、Array length(数组长度),其中Mark Word用于存储对象的hashCode和锁信息。
  • Lock的实现通常依赖于AbstractQueuedSynchronizer(AQS),AQS是一个队列同步器,用于构建锁的基础框架。Lock实现类都是基于AQS实现的。AQS内部定义了一个FIFO的队列来实现线程的同步,同时还定义了同步状态来记录锁的信息。

加分回答:

早期的synchronized在性能方面较差,不如Lock,但从Java 6开始,synchronized引入了偏向锁和轻量级锁,以减少锁带来的性能消耗,使性能与Lock相当。因此,性能差异已经不是主要问题。

在Java 6中引入了偏向锁和轻量级锁。偏向锁表示锁会偏向于某个线程,如果同一线程多次获得锁,只需简单测试Mark Word里是否存储着自己的线程ID即可,无需加锁和解锁操作,以提高性能。轻量级锁在获得锁时,会创建一个用于存储锁记录的空间,并将Mark Word复制到锁记录中,然后通过CAS方式将Mark Word替换为指向锁记录的指针。如果CAS成功,当前线程获得锁,如果失败,表示有其他线程竞争锁,当前线程会通过自旋等待获取锁。

这些锁的引入和优化,都是为了提高多线程并发性能,减少锁竞争带来的性能开销。在实际应用中,需要根据具体场景选择适合的锁机制。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/javainterview/8632.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】