请问java中的lock和synchronized区别是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问java中的lock和synchronized区别是啥?相关的知识,希望对你有一定的参考价值。
参考技术A1、ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候:
线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定;
如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断;
如果 使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情。
2、synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally中。
3、在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程.
java面试题lock和synchronized有什么区别?
学习目标:
掌握 lock 与 synchronized 的区别 理解 ReentrantLock 的公平、非公平锁 理解 ReentrantLock 中的条件变量 lock 与 synchronized 的区别有三个层面学习内容:
1.不同点
语法层面
-
synchronized 是关键字,源码在 jvm 中,用 c++ 语言实现
-
Lock 是接口,源码由 jdk 提供,用 java 语言实现
-
使用 synchronized 时,退出同步代码块锁会自动释放,而使用 Lock 时,需要手动调用 unlock 方法释放锁
2.功能层面
-
二者均属于悲观锁、都具备基本的互斥、同步、锁重入功能
-
Lock 提供了许多 synchronized 不具备的功能,例如获取等待状态、公平锁、可打断、可超时、多条件变量
-
Lock 有适合不同场景的实现,如 ReentrantLock, ReentrantReadWriteLock
3.性能层面
-
在没有竞争时,synchronized 做了很多优化,如偏向锁、轻量级锁,性能不赖
-
在竞争激烈时,Lock 的实现通常会提供更好的性能
4.公平锁
公平锁的公平体现
已经处在阻塞队列**中的线程(不考虑超时)始终都是公平的,先进先出
公平锁是指未处于阻塞队列中的线程来争抢锁,如果队列不为空,则老实到队尾等待
非公平锁是指未处于阻塞队列中的线程来争抢锁,与队列头唤醒的线程去竞争,谁抢到算谁的
公平锁会降低吞吐量,一般不用
5.条件变量
-
ReentrantLock 中的条件变量功能类似于普通 synchronized 的 wait,notify,用在当线程获得锁后,发现条件不满足时,临时等待的链表结构
-
与 synchronized 的等待集合不同之处在于,ReentrantLock 中的条件变量可以有多个,可以实现更精细的等待、唤醒控制
代码说明
day02.TestReentrantLock 用较为形象的方式演示
ReentrantLock 的内部结构
学习产出:
<font color=#999AAA
代码说明
day02.TestReentrantLock 用较为形象的方式演示
ReentrantLock 的内部结构
以上是关于请问java中的lock和synchronized区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章
转载Java中的锁机制 synchronized & Lock
Java同步锁——lock与synchronized 的区别转