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和ReadWriteLock读写锁,本文讲解了ReentrantLock概况、Lock接口、Lock使用、轮询锁的和定时锁、公平性、可中断获锁获取操作等内容,需要的朋友可以参考下
深入java并发编程,使用ReentrantLock和 Synchronized加锁
4、ReentrantLock底层实现和如何使用 5、Condition源码分析 6、ReentrantReadWriteLock底层实现原理 7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、...
java并发编程 基础知识,守护线程与线程, 并行和并发有什么区别? 什么是上下文切换? 线程和进程区别 什么是线程和进程? 创建线程有哪几种方式?,如何避免线程死锁 线程的 run()和 start()有什么区别? 什么是 ...
│ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...
Java并发编程基础主要包括以下几个核心方面: 线程与线程状态:理解Java中线程的基本概念,包括线程的创建、启动、暂停、恢复和终止。熟悉线程的生命周期及其不同状态,如新建、就绪、运行、阻塞和死亡。 线程同步...
Java并发编程实战 本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及...
1、本资源包含并发编程基础知识的使用案例,包括:线程创建、Synchronized和Reentrantlock锁的使用、线程安全问题演示、Condition的应用、CountDownLatch的应用、Cyclicbarrier的应用、Semaphore的应用、线程池的...
java并发编程1-9,可解压,并发编程必看资料。 1 Java 并发编程实践基础 2 构建线程安全应用程序 3 使用JDK 并发包构建程序 4 使用开源软件 Amino 构建并发应用程序 5 数据冲突及诊断工具MTRAT 6 死锁 7 显示锁 ...
Java多线程并发的程序中使用互斥锁有synchronized和ReentrantLock两种方式,这里我们来详解Java多线程编程中互斥锁ReentrantLock类的用法:
书籍:如《Java并发编程实战》、《Concurrency in C++》等。 官方文档:不同编程语言的官方文档通常会提供关于并发编程的指南和最佳实践。 社区和论坛:如Stack Overflow、Reddit等,可以提供实际问题的帮助和讨论。
│ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...
主要介绍了java(JUC)ReentrantLock的的相关资料,文中讲解非常详细,实例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
Java并发编程学习宝典(漫画版),Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习...
当然在release()方法中不仅仅只是将state- 1这么简单,- 1之后还需要进行一番处理,如果-1之后的新state = 0,则表示当前锁已经被线程释放
java语言 并发编程 ReentrantLock与synchronized区别 详解
1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗? 7.三大性质总结:原子性、可见性以及有序性 8....
之所以把这一章节叫做AQS简介而不是叫AQS详解,是因为已经有大神写过详解的文章Java并发之AQS详解,这篇文章对AQS的源码解析很透彻,博主读了之后受益匪浅,鉴于对原作者的尊重,所以如上附上原文的链接。...
我会根据下图中的技能点持续更新原创内容,技能列举的可能不是很完善,朋友们可以去【公众号】或【微信】给我提意见!都到这了,点个【Star】防走丢哦!...高并发编程-ReentrantLock非公平锁深入解析 高并发编程-Reent