首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
ReentranceLock 和 synchroniz...
[问答题]
请简单介绍ReentranceLock 和 synchronized 有什么区别
查看答案及解析
添加笔记
求解答(0)
邀请回答
收藏(208)
分享
纠错
7个回答
添加回答
0
西瓜同学🏀
1. 可重入性 字面的意思就是可以再次进入的锁,synchronized其实也是可重锁,同一线程每进入一次,锁的计数器都会加一,在释放锁是计数器都会减一,只有当计数器为0时才能释放锁 2 . 锁的实现 ReentrantLock是JDK实现的Synchronized是JVM实现 前者可以直接看到源码,后者实现难以看到 3.性能的区别 在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。
发表于 2019-04-30 22:27:29
回复(0)
更多回答
10
梦落琼花
1. 可重入性 字面的意思就是可以再次进入的锁,synchronized其实也是可重锁,同一线程每进入一次,锁的计数器都会加一,在释放锁是计数器都会减一,只有当计数器为0 时才能释放锁 2 . 锁的实现 ReentrantLock是JDK实现的 Synchronized 是JVM实现 前者可以直接看到源码,后者实现难以看到 3. 性能的区别 在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。都是试图在用户态就把加锁问题解决,避免进入内核态的线程阻塞。 4. 功能的区别 便利性:很明显Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。 锁的细粒度和灵活度:很明显ReenTrantLock优于Synchronized 当你需要时候一下三种功能是需要使用ReentrantLock ReentranLock 可以指定公平锁还是非公平锁 (公共锁就是先等待的线程先获得锁) 实现自旋锁,通过循环调用CAS操作来实现加锁,性能比较好,避免进入内核态的线程阻塞。 提供了Condition类,可以分组唤醒需要唤醒的线程 提供能够中断等待锁的线程的机制,lock.lockInterruptibly()
发表于 2018-12-25 15:05:45
回复(0)
0
流风无空
synchronized不可中断
发表于 2019-05-15 18:04:16
回复(0)
0
。。。。。dd
reentracelock(可重入锁)方便自己进行定义。1)公平锁,通过队列实现,先进先服务。2)非公平锁,新进入的线程有很大几率直接获得运行。
synchronized是用来标识,虚拟机在运行时会通过监视器来进行监视,由虚拟机自行优化。在引入偏向锁和轻量级锁(自旋锁)后执行效率提高。
发表于 2019-05-06 19:58:49
回复(0)
0
Soul~
1. 可重入性 字面的意思就是可以再次进入的锁,synchronized其实也是可重锁,同一线程每进入一次,锁的计数器都会加一,在释放锁是计数器都会减一,只有当计数器为0时才能释放锁 2 . 锁的实现 ReentrantLock是JDK实现的Synchronized是JVM实现 前者可以直接看到源码,后者实现难以看到 3.性能的区别 在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。都是试图在用户态就把加锁问题解决,避免进入内核态的线程阻塞。 4.功能的区别 便利性:很明显Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。 锁的细粒度和灵活度:很明显ReenTrantLock优于Synchronized 当你需要时候一下三种功能是需要使用ReentrantLock ReentranLock可以指定公平锁还是非公平锁 (公共锁就是先等待的线程先获得锁) 实现自旋锁,通过循环调用CAS操作来实现加锁,性能比较好,避免进入内核态的线程阻塞。 提供了Condition类,可以分组唤醒需要唤醒的线程 提供能够中断等待锁的线程的机制,lock.lockInterruptibly() 具体使用场景要根据实际的业务进行分析 使用Synchronized时不需要释放锁,jvm会帮助我们做释放锁的操作
发表于 2019-04-25 18:45:27
回复(0)
0
一个好名字
1. 可重入性 字面的意思就是可以再次进入的锁,synchronized其实也是可重锁,同一线程每进入一次,锁的计数器都会加一,在释放锁是计数器都会减一,只有当计数器为0时才能释放锁 2 . 锁的实现 ReentrantLock是JDK实现的Synchronized是JVM实现 前者可以直接看到源码,后者实现难以看到 3.性能的区别 在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。都是试图在用户态就把加锁问题解决,避免进入内核态的线程阻塞。
发表于 2019-04-25 18:24:45
回复(0)
0
Ly~
存在层次上:java的关键字,在jvm层面 锁的释放:以获取锁的代码块执行完毕释放,若是异常,jvm则会让线程释放锁 锁的阻塞:若是A线程获得锁,则B等待;若是A出现阻塞,则B一直处于阻塞 锁状态:无法判断 锁类型:可重入、非公平、不可中断 性能:少量同步 存在层次上:java类 锁的释放:在finally中必须释放锁,lock.unlock,否则会造成死锁 锁的阻塞:分情况而定,线程可以尝试获得锁,线程可以不用一直等待,主要是参考Lock接口中的lockInterruptibly()方法 锁状态:可以判断,可以通过trylock()方法来得知当前线程是否获得锁 锁类型:可重入、公平(亦可非公平)、可中断;ReentrantLock中默认是非公平锁的,new NofairSync 性能:大量同步
发表于 2019-04-25 18:00:21
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
测试工程师
Java
上传者:
小小
难度:
7条回答
208收藏
2281浏览
热门推荐
相关试题
切题之路
枚举
评论
(6)
电路如图所示,RL为负载电阻, 则...
模拟电路
评论
(1)
如下图所示的哈夫曼树,已知该哈夫曼...
树
评论
(1)
千亿模型训练中,数据并行(DP)通...
大模型开发
评论
(1)
下面选项中,哪些 Go 程序代码不...
Go
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题