ReentrantLock属于乐观锁还是悲观锁?

做过java高并发的小伙伴们都知道乐观锁和悲观锁吧,在java中有着这么一个ReentrantLock类,小伙伴们知道它是属于乐观锁还是悲观锁吗?下面就听小编为你介绍介绍吧。

首先,想要了解ReentrantLock到底是属于乐观锁还是悲观锁我们当然要先了解一下三者之间的基本概念与定义。

乐观锁

乐观锁,这个机制在其他线程每次拿数据时都乐观的认为它们肯定不会修改数据的,所以它不会去上锁,但是在更新的期间还是会判断一下这期间有没有不识趣的线程去修改这个数据。乐观锁可以使用版本号等机制实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

乐观锁一般是相对悲观锁而言的。乐观锁太乐观了,所以它采取的加锁机制会更为宽松。乐观锁一般不会去刻意使用数据库本身的锁机制,它会依赖数据本身来保证数据的正确性。

乐观锁它相信事务之间的数据竞争的概率是比较小的,因此它会尽可能的直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。

悲观锁

悲观锁,跟乐观锁一样,你一看名字就知道它很悲观,它的机制就是在每次去拿数据的时候都认为肯定会有不识时务的线程来捣乱,所以它与乐观锁相反,每次拿数据都会上一次锁,这样别想要拿到数据就会一直block直到它拿到锁。

在传统的关系型数据库中就用到了很多这种锁机制,如行锁,表锁等,读锁,写锁等各种锁功能,都是在做操作之前先上锁。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

ReentrantLock

ReentrantLock可重入锁,它是实现Lock接口的一个类,它十分支持重入性,表示为能够对共享资源能够重复加锁,即当前线程获取该锁时再次获取不会被阻塞。在java关键字synchronized中隐式支持重入性,synchronized则可以通过获取自增,释放自减的方式实现重入。同时,ReentrantLock还支持公平锁和非公平锁两种方式。

类图如下:

ReentrantLock属于乐观锁还是悲观锁

ReentrantLock源码:

ReentrantLock属于乐观锁还是悲观锁

所以由以上我们可以看到,ReentrantLock底层是由AQS实现的,ReentrantLock机制可以说是实打实的悲观锁,你明白了吗?

以上就是关于ReentrantLock的所有内容,你都懂了吧,更多java锁机制常见问题及答案尽在奇Q工具网。

推荐阅读:

ReentrantLock的实现原理是怎样的?详解

Synchronized和Reentrantlock区别是什么?简单叙述

乐观锁和悲观锁的区别有什么?有什么作用?