首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
synchronized和Lock有什么区别
[问答题]
synchronized和Lock有什么区别
添加笔记
求解答(0)
邀请回答
收藏(289)
分享
纠错
39个回答
添加回答
79
十七_
synchronized是同步锁,可以修饰静态方法、普通方法和代码块。修饰静态方法时锁住的是类对象,修饰普通方法时锁住的是实例对象。当一个线程获取锁时,其他线程想要访问当前资源只能等当前线程释放锁。 synchronized是java的关键字,Lock是一个接口。 synchronized可以作用在代码块和方法上,Lock只能用在代码里。 synchronized在代码执行完或出现异常时会自动释放锁,Locl不会自动释放,需要在finally中释放。 synchronized会导致线程拿不到锁一直等待,Lock可以设置获取锁失败的超时时间。 synchronized无法获知是否获取锁成功,Lock则可以通过tryLock判断是否加锁成功。
发表于 2022-04-28 14:23:54
回复(2)
20
香鸭蛋
1.lock是一个接口,synchronized是java关键字。 2.lock不会主动释放,需要手动释放锁。 3.lock可以通过tryLock()查看是否加锁成功,而synchronized无法获悉是否加锁成功。
发表于 2022-05-10 14:19:37
回复(0)
11
牛客461097395号
1. 使用方式:synchronized隐式锁,自动释放锁,在这种同步方式下,我们需要依赖Monitor(同步监视器)来实现线程通信。作用在静态方法上,类的Class对象;实例方法上,当前实例(this);代码块上,则需要在关键字后面的小括号里显式指定一个对象作为Monitor。 Lock接口是显式锁,手动释放,Lock接口具备更大的灵活性。 2. 功能特性:Lock弥补了synchronized的不足,它新增特性包括:可中断地获取锁,非阻塞地获取锁,可超时地获取锁 3. 实现机制:synchronized的底层是采用Java对象头来存储锁信息的,lock通过trylock查看是否加锁成功
发表于 2022-05-12 20:02:40
回复(0)
5
牛客358662076号
1.s是关键字 L是接口 2.s在执行完或和出现异常会自动释放锁,L不会 3.L能够使用try L查看是否获取锁成功,s不能
发表于 2022-08-08 08:59:43
回复(0)
3
牛客793464225号
区别:1.synchronized比lock锁接口出现要早。2.synchronized既可以修饰静态方法,也可以修饰实例方法以及代码块。3.synchronized的实现方式是基于JVM的,外人不能更改,而lock锁接口是外部API。4。synchronized支持的功能少于lock锁接口,lock锁接口在支持synchronized原有功能的基础上,还支持超时机制和响应中断等功能。5.synchronized底层采用java对象头来存储锁信息,lock实现类是基于AQS实现的。早期synchronized的性能很差,只有“无锁”和“有锁两种状态”,但是后期synchronized引入了锁升级机制,有了很大改善。锁现在有四种状态:无锁,偏向锁,轻量级锁,及重量级锁。,减少了获取锁和释放锁带来的性能消耗。
发表于 2022-06-15 19:23:50
回复(0)
2
岑溪123
第一:lock可以中断释放锁:(线程在获取锁的过程中可以被中断),可超时释放锁(若线程在到达超时时间后仍未获得锁,并且线程也没有被中断,则返回false),而synchronized不能。第二:lock需要在finally中手动的释放锁,而synchronized会在jvm字节码层面自动的释放锁。第三:lock可以设置多个条件变量也就是多个waitset队列,唤醒时不需要像synchronized一样唤醒全部的线程而是唤醒对应的waitset队列中的线程。第四:entryList集合中处于blocked状态的线程,lock可以通过公平锁实现队列中的线程先来先得的获得cpu使用权,只不过会降低并发度。第五、lock只能用于方法中,而synchronized可以用于方法上和方法中。第六、lock和synchronized都支持可重入也就是同一个线程获取同一把锁时不会被阻塞,而是直接使用。
编辑于 2023-03-30 01:24:58
回复(0)
2
大哥们不要卷我
synchronized是同步锁,可以修饰静态方法、普通方法和代码块。修饰静态方法时候锁住的是类对象,修饰普通方法时锁住的是实例对象。当一个线程获取锁时,其他线程想要访问当前资源只能等当前线程释放锁,synchronized是Java的关键字,lock是一个接口,synchronized可以作用在代码块和接口上,lock只能引用在代码里。synchronized咋代码执行结束后自动释放锁,lock不会自动释放锁,需要在finally中释放锁,lock可以通过try lock查看是否加锁成功,而synchronized则不能判断是否加锁成功。
发表于 2022-06-09 19:51:55
回复(0)
1
清州化雨
sychronized与Lock:自动释放锁;手动释放锁。无法得知线程是否获得锁;通过tryLock()判断是否获得锁。可以用在代码块,方法,静态方法;只能用在代码块上。会进行锁升级操作;是一个关键字;是一个接口。
发表于 2022-08-09 16:29:10
回复(0)
1
Chaos1874
Synchronize和Lock都是多线程实现同步的方式,Synchronize根据作用的对象不同其加锁方式也就不同,作用于静态方法,以类对象加锁,作用域实例方法以类对象实例加锁,作用于类也是以类对象加锁,再加锁中使用Objct自带的wait方法或Thread类的静态sleep方法非静态yield等一系列方法来实现线程之间的交互。lock一般在某个方法中显示的运用其lock方法和unlock方法进行加锁解锁,所以synchronize不需要显示的去释放锁,使用condition对象来实现线程之间的交互。Synchronize是基于jvm底层实现的,同时引入锁的四种状态:无锁,偏向锁,轻量级锁,重量级锁。根据不同的状态使得线程采用不同的加锁方式以提高同步效率。Lock是基于AQS多线程同步器实现的,底层维护了一个int类型的变量state用来表示锁的状态,state=0表示锁可以获得,state>0表示锁已经被占用。多个线程以CAS的方式去修改state的值以实现锁的竞争。
发表于 2022-05-21 13:40:52
回复(0)
0
牛客766045892号
lock是一个接口,synchronized是java中的关键字;lock可以知道是否获取到锁,synchronized不知道;发生异常时,synchronized会自动释放锁,lock需要手动释放,将unlock方法写在fimali中,lock可以中断锁,synchronized不可以
发表于 2024-05-14 10:16:14
回复(0)
0
佩奇大大
(1)synchronized是关键字,lock是接口 (2)synchronized是隐式的加锁,lock是显示的加锁 (3)synchronized可以作用于方法上,lock只能作用于方法块 (4)synchronized 底层用的是objectMonitor,lock采用的是AQS (5)synchronized是阻塞式加锁,lock是非阻塞式加锁支持可中断式加锁,支持超时时间的加锁
编辑于 2024-04-03 10:14:49
回复(0)
0
也不容易的可乐很高大
jvm 层面的锁 是synchronized lock锁是jdk下的juc包的锁。 synchronized锁是隐式的出现异常或者代码执行完成后会自动释放锁,Lock锁需要手动在finally释放,synchronized锁可以作用在方法(实例对象) 静态方法(锁类的Class对象) 变量。
发表于 2024-04-02 16:09:50
回复(0)
0
钟情于风TuT
1.lock是一个接口,synchronized是java关键字。 2.lock不会主动释放,需要手动释放锁。 3.lock可以通过tryLock()查看是否加锁成功,而synchronized无法获悉是否加锁成功。
发表于 2024-04-01 17:47:47
回复(0)
0
Penalize
答:synchronized是同步锁,其是一种隐式锁即无需显式获取和释放锁。可以修饰静态方法、普通方法和代码块。修饰静态方法时,加锁当前类。修饰普通方法时,加锁当前实例。修饰代码块时,需要在关键字后面的小括号内显式指明加锁对象。lock是显示锁,即加锁时需要显式的进行加锁和解锁。
编辑于 2024-03-27 21:55:28
回复(0)
0
牛客380258662号
synchronized是关键字 Lock是接口 synchronized关键字可修饰静态方法、普通方法、代码块 锁定的是类对象或实例对象 Lock是写在代码中的 synchronized在线程执行结束或发生异常时,会自动释放锁 Lock需手动释放锁 synchronized在获取不到锁时会进行循环等待,无法得知所得状态 Lock通过tryLock()可得知是否加锁成功 也可设置超时时间
编辑于 2024-02-28 21:37:42
回复(0)
0
Rainbow_7
1. 通信方式:synchronized monitor、lock condition 2. 底层:synchronized 对象头、lock AQS 3. 是否需要手动释放锁:synchronized 不需要、lock 需要 4. lock 支持非阻塞、支持超时机制、支持响应中断
发表于 2024-02-22 17:31:20
回复(0)
0
中國移不動
使用方式: synchronized是一种内置的Java关键字,用于同步代码块或方法。可以在方法内使用synchronized关键字或在方法上使用synchronized修饰符,也可以使用synchronized代码块。 Lock是一个接口,Java提供了多个实现类,如ReentrantLock和ReadWriteLock。使用Lock需要显式地创建一个锁对象,并在代码中使用该对象来控制同步。 灵活性: Lock提供了更多的灵活性。它允许实现更复杂的同步结构,如可重入锁、读写锁、条件等。可以通过不同的Lock实现来选择最适合你需求的同步方式。 synchronized相对较简单,通常用于基本的同步需求。 异常处理: 使用Lock时,可以显式地处理锁的获取和释放过程中可能发生的异常。这可以更好地控制异常情况下的处理逻辑。 synchronized隐式地处理锁的获取和释放,因此无法轻松地捕获并处理与锁相关的异常。 性能: 一般情况下,synchronized的性能比Lock稍差。synchronized在进入和退出同步块时会涉及到更多的开销,而Lock通常具有更低的开销。 但是,性能差距通常在实际应用中不是很大,而且可能因具体情况而异。在高度并发的情况下,Lock可能更有优势。 可中断性: Lock允许你在等待锁的过程中响应中断。这意味着如果一个线程在等待锁时被中断,它可以选择放弃等待。 synchronized不支持线程中断,一旦一个线程进入等待状态,只能等待锁的释放。
发表于 2023-09-25 10:48:46
回复(0)
0
神奇的打工人加油
语法层面:synchronized是关键字,源码在jvm中,底层由c++语言实现,退出同步代码块会自动释放锁 lock是接口,源码由jdk提供,是java语言实现的,通过调用方法实现加锁解锁 功能层面:二者均是悲观锁,具备基本的互斥、重入、同步等功能 lock接口提供了许多synchronized不具备的功能:设置公平锁和非公平锁、超时机制、可打断、多条件变量 性能层面:没有竞争时,synchronized通过偏向锁、轻量级锁等优化,性能更好 竞争激烈时,synchronized会锁升级,lock的性能会更好
发表于 2023-08-22 17:24:28
回复(0)
0
jdasji
前者是java对象头实现,后者是AQS实现。前者是java提供的关键字,可用于修饰代码块,静态方法,普通方法,lock是接口只能修饰代码块。synchronized执行后自动释放锁,lock需要手动释放。lock提供了许多synchronized不拒有的方法
发表于 2023-08-11 15:10:47
回复(0)
0
信女愿用5年寿命换取一个offer
1.synchronized可以修饰静态方法(锁住类对象)、普通方法(锁住实例对象)和代码块,.Lock是一个接口,只能用在代码中 2.当一个线程获取ynchronized锁后,其他线程访问当前资源只能等待锁的释放(锁的释放是自动的)。而lock在代码执行结束或出现异常时不会自动释放锁,需要finally中释放。 3.synchronized会导致线程拿不到锁而一直等待,而Lock可以设置获取锁失败的超时时间。 4.synchronized无法判断锁是否获取成功,而lock可以通过try lock判断
发表于 2023-07-13 11:15:41
回复(1)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
Java
上传者:
real19931
难度:
39条回答
289收藏
1711浏览
热门推荐
相关试题
体育课测验(二)
广度优先搜索(BFS)
拓扑排序
dfs
评论
(2)
游戏内数据分析涉猎的少,如何证明自...
评论
(1)
之前的经历中单品数据分析的经验丰富...
评论
(1)
什么样的人适合做数据分析
评论
(1)
2022 诺瓦科技 Perl re...
perl
System Verilog
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题