前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[面试总结篇] Synchronized 和 Lock 的区别

[面试总结篇] Synchronized 和 Lock 的区别

作者头像
BUG弄潮儿
发布于 2022-12-05 13:12:21
发布于 2022-12-05 13:12:21
7070
举报
文章被收录于专栏:JAVA乐园JAVA乐园

1. synchronized是一个关键字而lock是一个接口(lock、lockInterruptibly、tryLock、unlock、newCondition)。

2. synchronized是隐式的加锁,lock是显示的加锁。

3. synchronized可以作用在方法和代码块上,而lock只能作用在代码块上。

synchronized 作用在静态方法上锁的是当前类的class;作用在普通方法上锁的是当前类的对象;作用于代码块上锁的是synchronized(xxx),括号里的对象 使用javap反编译成字节码后,锁代码块时,synchronized关键字需要有一个代码块进入的点monitorenter,代码块退出和代码块异常的出口点monitorexit;锁方法时,使用ACC_SYNCHRONIZED标识

4. synchronized是阻塞式加锁,而lock中的trylock支持非阻塞式加锁。

5. synchronized没有超时机制,而lock中的trylcok可以支持超时机制。

6. synchronized不可中断,而lock中的lockInterruptibly可中断的获取锁。

ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,这时不用获取锁,而会抛出一个InterruptedException。ReentrantLock.lock方法不允许Thread.interrupt中断,即使检测到Thread.isInterrupted,一样会继续尝试获取锁,失败则继续休眠。只是在最后获取锁成功后再把当前线程置为interrupted状态,然后再中断线程。

7. synchronized采用的是monitor对象监视器,lock的底层原理是AQS

8. synchronized只有一个同步队列和一个等待队列,而lock有一个同步队列,可以有多个等待队列。

  • 同步队列:排队取锁的线程所在的队列。
  • 等待队列:调用 wait 方法后,线程会从同步队列转移到等待队列。

9. synchronized是非公平锁,而lock可以是公平锁也可以是非公平锁。

10. synchronized用object的notify / notifyAll方法进行唤醒,而lock用condition进行唤醒。

11. lock有ReadWriteLock支持并发读。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
58面试官居然问我Synchronized底层实现,锁升级的具体过程?
这是我去年7,8月份面58被问的一个面试题,说实话被问到这个问题还是很意外的,感觉这个东西没啥用啊,直到后面被问了一波new Object,Integer对象等作为加锁对象行吗?会出现哪些问题?为啥java6后synchronized性能大幅上升?我彻底蒙蔽了。下面详细总结一下
Java识堂
2020/02/19
8031
Java多线程---ReentrantLock
重入锁。同一个线程可以锁住多次,但是在使用完毕后,必须释放多次锁才能将锁完全释放,否则,还是该线程还是会处于阻塞状态。并且重入锁有两种,一种是公平锁,一种是非公平锁,公平锁会把锁按照顺序轮流交付线程执行,而非公平锁不会,非公平锁会乱序选择一个线程执行。
None_Ling
2018/10/24
4750
搞懂这几个锁用法,多线程就懂一半了
synchronized机制是给共享资源上锁,只有拿到锁的线程才可以访问共享资源,这样就可以强制使得对共享资源的访问都是顺序的。
BUG弄潮儿
2020/06/12
3390
通过一个故事理解可重入锁的机制
在一个村子里面,有一口井水,水质非常的好,村民们都想打井里的水。这井只有一口,村里的人那么多,所以得出个打水的规则才行。村长绞尽脑汁,最终想出了一个比较合理的方案,咱们来仔细的看看聪明的村长大人的智慧。
小勇DW3
2018/08/30
9560
通过一个故事理解可重入锁的机制
我去了,一篇文章,看懂锁???
Lock和synchronized,是最常见的锁,都可以达到线程安全的目的,功能常见不同
Joseph_青椒
2023/08/28
2280
我去了,一篇文章,看懂锁???
多线程基础
Java提供了多种多线程锁机制的实现方式,每种机制都有优缺点与各自的适用场景,常见的有:
shimeath
2020/07/30
4050
ReentrantLock 与 AQS 源码分析
ReentrantLock 与 AQS 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE 方便,所以在 github 上提供JDK1.8 的源码、详细的注释及测试用例。欢迎大家 star、fork ! 2. 由于个人水平有限,对源码的分析理解可能存在偏差或不透彻的地方还请大家在评论区指出,谢谢! 1. 基本结构    重入锁 ReetrantLock,JDK 1.5新增的类,作用与synchronized关键字相当,但比sy
lwen
2018/04/11
8410
ReentrantLock 与 AQS 源码分析
面试官问我懂不懂AQS和ReentrantLock,我把这篇文章甩给他
AbstractQueuedSynchronizer抽象队列同步器——用于构建锁或其他同步组件的基础框架
淇妙小屋
2022/03/31
2940
面试官问我懂不懂AQS和ReentrantLock,我把这篇文章甩给他
线程安全问题,synchronized 和 ReentrantLock 详细讲解
线程安全问题指的是在多线程中,各线程之间因为同时操作所产生的数据污染或其他非预期的程序运行结果(最近穿插点面试课题讲一讲)。
架构师修炼
2020/07/20
6970
线程安全问题,synchronized 和 ReentrantLock 详细讲解
面试突击39:synchronized和ReentrantLock有什么区别?
在 Java 中,常用的锁有两种:synchronized(内置锁)和 ReentrantLock(可重入锁),二者的功效都是相同得,但又有很多不同点,所以我们今天就来聊聊。
磊哥
2022/05/09
5570
面试突击39:synchronized和ReentrantLock有什么区别?
分门别类总结Java中的各种锁
非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。
李红
2019/05/29
5250
ReentranLock及源码解析(学思想,一步一步点进源码)
我们知道在并发的场景下,如果同时对共享代码块进行访问时,会导致原子性、有序性、可见性问题。从而导致我业务出错。所以有时候,我们有些代码块不能进行并行,就得去改成串行!!之前我们已经知道了一个Synchronized重量级锁。该锁底层是JVM里面,通过monitor锁来实现串行,其他线程进行等待。
向着百万年薪努力的小赵
2022/12/02
2460
ReentranLock及源码解析(学思想,一步一步点进源码)
锁:Sychronized、Lock
锁是用来在多线程并发阶段保障数据同步的重要手段,防止出现脏数据,加锁代码在某个时间点只能由一个线程运行,其他线程等待。
Liusy
2020/09/01
4350
锁:Sychronized、Lock
这篇 ReentrantLock 看不懂,加我我给你发红包
在开始本篇文章的内容讲述前,先来回答我一个问题,为什么 JDK 提供一个 synchronized 关键字之后还要提供一个 Lock 锁,这不是多此一举吗?难道 JDK 设计人员都是沙雕吗?
cxuan
2020/01/17
5160
这篇 ReentrantLock 看不懂,加我我给你发红包
Lock和synchronized比较详解(转)
从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。
Isaac Zhang
2019/09/10
5120
Lock和synchronized比较详解(转)
ReentrantLock可重入锁 Krains 2020-08-27
与 synchronized 一样,都支持可重入,但相对于 synchronized 它还具备如下特点
Krains
2020/09/10
5580
ReentrantLock可重入锁  Krains 2020-08-27
聊聊并发编程: Lock
之前学习了如何使用synchronized关键字来实现同步访问,Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。
烂猪皮
2023/09/04
2300
聊聊并发编程: Lock
【高并发】面试官:Java中提供了synchronized,为什么还要提供Lock呢?
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
5240
【高并发】面试官:Java中提供了synchronized,为什么还要提供Lock呢?
Java并发编程--Lock
  Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。synchronized方法或代码块的使用提供了对与每个对象相关的隐式监视器锁的访问,但却强制所有锁获取和释放均要出现在一个块结构中:当获取了多个锁时,它们必须以相反的顺序释放,且必须在与所有锁被获取时相同的词法范围内释放所有锁。Lock 实现提供了使用 synchronized 方法和语句所没有的其他功能,包括提供了一个非块结构的获取锁尝试 (tryLock())、一个获取可中断锁的尝试 (lockInterruptibly()) 和一个获取超时失效锁的尝试 (tryLock(long, TimeUnit))。
在周末
2019/09/11
4690
AQS独占锁和重入锁详解
在我们并发编程的文章一开始,我们都是在围绕着线程安全问题叙述它的解决方案,在前面的文章中我们曾提到过CAS无锁机制、synchronized关键字等多种解决方案,在其中CAS机制属于乐观锁类型,synchronized关键字属于悲观锁类型,而我们本章要谈到的基于AQS实现的ReetrantLock也是属于悲观锁类型的实现。但是它与我们之前聊的synchronized并不相同,synchronized关键字属于隐式锁,锁的获取和释放都是隐式的,且不需要开发人员干预。而我们本章要讲的则是显式锁,即锁的获取和释放都需要我们手动编码实现。在JDK1.5时,官方在Java.uitl.concurrent并发包中添加了Lock锁接口,该接口中定义了lock()获取锁和unlock()释放锁两个方法对显式锁的加锁与解锁操作提供了支持。显式锁的使用方式如下:
派大星在吗
2021/12/17
1.6K0
推荐阅读
相关推荐
58面试官居然问我Synchronized底层实现,锁升级的具体过程?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档