java中synchronized锁和ReentrantLock锁的区别是什么?详细解析

BSO 2020-11-16 16:17:24 java常见问答 5444

java中有很多的知识非常的繁琐,经常需要我们花费大量的时间和精力去学习和理解。关于synchronized锁和ReentrantLock锁的知识点有很多,你都掌握了吗?一起来了解一下吧。

首先说一下,synchronized锁和ReentrantLock锁的区别

synchronized是在JVM层面上实现的,可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中

在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;

然后为大家补充一些相关的知识点。

CountDownLatch、CyclicBarrier(同步屏障)、信号灯区别

1、CyclicBarrier多个线程相互等待,直到所有的线程都完成,如果他们之间任何一个线程没有完成,所有的线程都必须等待。

举例:await()、getNumberWaiting()

2、CountDownLatch控制多个线程的执行顺序,调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值countDown()减到0为止。

举例:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。如下图:

java中synchronized锁和ReentrantLock锁的区别是什么

3、Semaphore信号灯,场景:停车场运作、限流

假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。代码如下所示:

// 获取许可
semp.acquire();
...
// 访问完后,释放
semp.release();

以上就是关于java中synchronized锁和ReentrantLock锁的区别是什么的详细解析了。如果你对java知识感兴趣,想要了解更多java基础知识,敬请关注奇Q工具网。

推荐阅读:

synchronized是悲观锁吗?synchronized使用场景介绍

synchronized和volatule区别是什么?synchronized详解

synchronized的用法有哪些?synchronized使用方法详解