
金三银四精选面试题-线程加锁有哪些方式?synchronized和lock的区别?
发布时间:2023-11-16 09:46:12
线程加锁有哪些方式?synchronized和lock的区别?
- synchronized关键字
- Java.util.concurrent包中的lock接口和ReentrantLock实现类
类别 |
synchronized |
Lock |
存在层次 |
Java的关键字,在JVM层面上 |
是一个接口 |
锁的释放 |
1、以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁 |
在finally中必须释放锁,不然容易造成线程死锁 |
锁的获取 |
假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待 |
分情况而定,Lock有多个锁获取的方式,大致就是可以尝试获得锁,线程可以不用一直等待(可以通过tryLock判断有没有锁) |
锁状态 |
无法判断 |
可以判断 |
锁类型 |
可重入 不可中断 非公平 |
可重入 可判断 可公平(两者皆可) |
性能 |
少量同步 |
大量同步 |
Synchronized和Lock的区别:Synchronized编码更简单,锁机制由JVM维护,在竞争不激烈的情况下性能更好。Lock功能更强大更灵活,竞争激烈时性能较好。
- 性能不一样:资源竞争激励的情况下,lock性能会比synchronized好,竞争不激励的情况下,synchronized比lock性能好,synchronized会根据锁的竞争情况,从偏向锁-->轻量级锁-->重量级锁升级,而且编程更简单。
- 锁机制不一样:synchronized是在JVM层面实现的,系统会监控锁的释放与否。lock是JDK代码实现的,需要手动释放,在finally块中释放。可以采用非阻塞的方式获取锁。
- synchronized的编程更简洁,lock的功能更多更灵活,缺点是一定要在finally里面 unlock()资源才行。
- 法不一样:synchronized可以用在代码块上,方法上。lock只能写在代码里,不能直接修改方法。
Lock支持的功能:
- 公平锁:Synchronized是非公平锁,Lock支持公平锁,默认非公平锁
- 可中断锁:ReentrantLock提供了lockInterruptibly()的功能,可以中断争夺锁的操作,抢锁的时候会check是否被中断,中断直接抛出异常,退出抢锁。而Synchronized只有抢锁的过程,不可干预,直到抢到锁以后,才可以编码控制锁的释放。
- 快速反馈锁:ReentrantLock提供了trylock() 和 trylock(tryTimes)的功能,不等待或者限定时间等待获取锁,更灵活。可以避免死锁的发生。
- 读写锁:ReentrantReadWriteLock类实现了读写锁的功能,类似于MySQL,锁自身维护一个计数器,读锁可以并发的获取,写锁只能独占。而synchronized全是独占锁
- Condition:ReentrantLock提供了比Sync更精准的线程调度工具,Condition,一个lock可以有多个Condition,比如在生产消费的业务下,一个锁通过控制生产Condition和消费Condition精准控制。

最新资讯
查看更多-
1
金三银四精选面试题-线程加锁有哪些方式?synchronized和lock的区别?
-
2
金三银四精选面试题-内存溢出一般发生在哪个区?永久代会不会导致内存溢出?
-
3
金三银四精选面试题-CAS是一种什么样的同步机制?
-
4
金三银四精选面试题-你们线上应用的JVM参数有哪些?
-
5
金三银四精选面试题-简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。
-
6
金三银四精选面试题-在自己的代码中,如果创建一个java.lang.String类,这个类是否可以被类加载器加载?为什么。
-
7
金三银四精选面试题-Error和Exception的区别,CheckedException,RuntimeException的区别
-
8
金三银四精选面试题-JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计?
-
9
金三银四精选面试题-Java中的HashMap内部是如何工作的
-
10
金三银四精选面试题-用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。