Java并发编程锁系列之ReentrantLock对象总结

在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种。ReentranckLock就是其中的多个分类。

本文主要内容:重入锁理解;重入锁代码演示; ReentranckLock的总结

本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《Lock系列》教程的第四篇:《Java并发包下锁学习第六篇:ReentranckLock的总结》。

我们先来看看内部结构:

ReentranckLock内部有三个内部类,分别是:

Sync:继承了AbstractQueuedSynchronizer(AQS)同步器的内部类,来实现同步机制的;

FairSync:公平锁对象;

NonfairSync:非公平锁对象。

关于公平锁与非公平锁详细介绍文章见:《Java并发编程锁之独占公平锁与非公平锁比较》和《Java并非锁之独占非公平锁理解》两篇文章。

再来看看对象名称:Reentranck的中文意思:再入、重入的意思。即该对象还是重入锁。

公平锁和非公平锁在获取锁的区别在于:

公平锁获取锁的时候,进入排队。源码如下图:

非公平锁线尝试插队,如果插队不成功再进行排队。源码如下图:

那么什么是重入锁呢?

重入锁(递归锁)可以理解为:同一个线程函数获得锁之后,内层递归函数依然能够获取到该锁对象的代码,也即,在同一个线程的外层方法访问的时候,获取到了锁,在进入内层方法后能够自动获取到锁。线程可以进入任何一个它已经拥有的锁所同步着的代码块。额,说的啥意思?每个中文都认识,但是组合在一起,就不知道啥意思了。

我们来举个生活中的例子:

在现实生活中,我们一般只需要带有自己大门的钥匙(当然,如果是合租的朋友还需要带着自己房间的钥匙)。当我们开了大门的钥匙,进入房间后,我们在去厨房或者是去卫生间的时候,不用在拿钥匙开厨房或者卫生间的门了吧。为啥呢?因为我们已经已经有大门的锁的钥匙并且已经进入到了房间了。厨房和卫生间已经在大门锁管理的范围内了。这种场景站在并发锁的角度来看的话:一同一个线程函数获得锁之后(你拿着钥匙打开了大门之后),内层递归函数依然能够获取到该锁对象的代码(进入房间后,房间内的厨房卫生间可以随便出入)。这样是不是就好理解了?

如果还是不理解的话,可以想想spring默认的事务传递方式。一个方法开启了事务,默认这个方法调用其他方法,也会使用这个事务。这样是不是就好理解了。

重入锁代码演示

先来看看,被线程操作的资源类:message对象

在message对象中,sendMsg使用了锁,sendEmail方法也使用了锁,而且在sendMesg方法中调用了sendEmail方法。

这个时候使用三个线程来操作:

运行结果:

我们从运行的结果中,可以看出,同一个线程操作了两个带有锁的方法。

说明ReentrantLock是可重入锁。

总结:

经过前面几篇及本篇的学习,我们可以对ReentrantLock(以下简称:RLock)得到如下总结

1:从线程是否需要对资源进行加锁方面来看的话,RLock是悲观锁;

2:从锁是否需要排队的公平性来区分的话,RLock的FairSync对象是公平锁而NonfairSync对象是非公平锁;

3:从多个线程能共享一把锁的角度来分的话RLock属于排他锁(独占式锁);

从锁是否重复获取角度来看,属于可重入锁

欢迎来聊~

Java并发编程锁系列之ReentrantLock对象总结的更多相关文章

  1. java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock

    原文:java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock 锁 锁是用来控制多个线程访问共享资源的方式,java中可以使用synch ...

  2. Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...

  3. Java 并发编程(四):如何保证对象的线程安全性

    01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中的经典之作,但我还是忍不住.因为第四章"对象的组合 ...

  4. 读书笔记-----Java并发编程实战(二)对象的共享

    public class NoVisibility{ private static boolean ready; private static int number; private static c ...

  5. Java并发编程,深入理解ReentrantLock

    ReentrantLock简介 ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁, 支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次 ...

  6. java并发编程实践学习(2)--对象的组合

    先验条件(Precondition):某些方法包含基于状态的先验条件.例如,不能从空队列中移除一个元素,在删除元素前队列必须处于非空状态.基于状态的先验条件的操作成为依赖状态操作. 在单线程中,如果某 ...

  7. 【JAVA并发编程实战】2、对象的组合

    1. 设计线程安全的类 1.找出构成对象状态的所有变量 2.找出约束状态变量的不变性条件 3.建立对象状态的并发访问管理策略 package cn.xf.cp.ch04; /** * *功能:JAVA ...

  8. JAVA并发编程学习笔记之ReentrantLock

    ReentrantLock是一个可重入的互斥锁,ReentrantLock由最近成功获取锁,还没有释放的线程所拥有,当锁被另一个线程拥有时,调用lock的线程可以成功获取锁.如果锁已经被当前线程拥有, ...

  9. 【Java并发编程】15、ReentrantLock实现原理深入探究

    原文已经写得非常详细了,直接把大神的文章转发过来了  https://www.cnblogs.com/xrq730/p/4979021.html 前言 这篇文章被归到Java基础分类中,其实真的一点都 ...

随机推荐

  1. Object-C 银行卡,信用卡校验规则(Luhn算法)

    最近的项目中涉及到绑定用户的银行卡,借记卡.经过查找银行卡的校验规是采用 Luhn算法进行验证. Luhn算法,也被称作“模10算法”.它是一种简单的校验公式,一般会被用于身份证号码,IMEI号码,美 ...

  2. Java Web环境配置

    准备工作 jdk-8u241 apache-tomcat-9.0.31-windows-x64.zip Eclipse IDE for Enterprise Java Developers 关于版本选 ...

  3. pip install mysqlclient报错(OSError: mysql_config not found)

    报错截图 一般情况是系统没有安装libmysqld-dev 执行 sudo apt install libmysqld-dev完成安装后再 pip install mysqlclient就可以了(系统 ...

  4. 提高开发效率之VS Code基础配置篇

    背景 之前一直是只用WebStorm作为IDE来编写代码,但是由于: 手中的这台Mac接了两个显示器以后,使用WebStorm会有卡顿. WebStorm需要付费(虽然可以通过某方法和谐). 所以需要 ...

  5. Asp.Net Core IdentityServer4 中的基本概念

    一.前言 这篇文章可能大家会觉得很空洞,没有实际的实战东西,主要是自己整理出来的IdentityServer4 的一些概念性的东西:如果你对IdentityServer4有过一定的实战经验,可以跳过不 ...

  6. 基于sklearn的metrics库的常用有监督模型评估指标学习

    一.分类评估指标 准确率(最直白的指标)缺点:受采样影响极大,比如100个样本中有99个为正例,所以即使模型很无脑地预测全部样本为正例,依然有99%的正确率适用范围:二分类(准确率):二分类.多分类( ...

  7. yolo3各部分代码详解(超详细)

    0.摘要 最近一段时间在学习yolo3,看了很多博客,理解了一些理论知识,但是学起来还是有些吃力,之后看了源码,才有了更进一步的理解.在这里,我不在赘述网络方面的代码,网络方面的代码比较容易理解,下面 ...

  8. Python可以用中文命名

    Python中文命名 命名规则数字.字母.下划线 环境 python 3.7.3 x64 win10 现象 Python在命名的地方都是可以用中文命名 如: 变量 中文下划线无法被识别 打出中文下划线 ...

  9. js 验证输入框是否为空

    很多时候,菜鸟在对输入框是否输入值进行验证时,总会把输入“空字符串”这一状况给忽略掉.嗯,我就这样,所以记下,以后回忆下还是不错滴 <input type="text" id ...

  10. linux下查看系统版本

    工作中我们会遇到安装软件需要知道linux是什么发行版本,话不多话上干货(按照我认为常用排序) 1. lsb_release -a 名词解释:LSB (Linux Standard Base) # 如 ...