请问java中的lock和synchronized区别是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问java中的lock和synchronized区别是啥?相关的知识,希望对你有一定的参考价值。

参考技术A

1、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 的区别转

java面试题lock和synchronized有什么区别?

java中synchronized与lock的理解与应用

Java中的Lock

synchronized和lock