2019独角兽企业重金招聘Python工程师标准>>>

经常看到网上的人说,可重入锁一词,但是总是没怎么了解,到底什么是可重入锁,一直是一个模糊的概念,下面来大致总结一下。

可重入锁:指的是同一个线程多次试图获取它所占有的锁,请求会成功。当释放锁的时候,直到重入次数清零,锁才释放完毕。

      再之前的我的博客:java synchronized关键字的用法--对象锁和类锁

http://my.oschina.net/u/1540325/blog/682950

里面最后我贴了一个程序:

public class MultiLock {public synchronized void f1(int count, String threadName) {if (count-- > 0) {Print.print(threadName + ":f1() calling f2() with count " + count);f2(count, threadName);}}public synchronized void f2(int count, String threadName) {if (count-- > 0) {Print.print(threadName + ":f2() calling f1() with count " + count);f1(count, threadName);}}public static void main(String[] args) throws Exception {final MultiLock multiLock = new MultiLock();new Thread() {public void run() {String name = Thread.currentThread().getName();multiLock.f1(10, name);}}.start();new Thread() {public void run() {String name = Thread.currentThread().getName();multiLock.f2(10, name);}}.start();}
}
输出结果如下:Thread-1:f2() calling f1() with count 9
Thread-1:f1() calling f2() with count 8
Thread-1:f2() calling f1() with count 7
Thread-1:f1() calling f2() with count 6
Thread-1:f2() calling f1() with count 5
Thread-1:f1() calling f2() with count 4
Thread-1:f2() calling f1() with count 3
Thread-1:f1() calling f2() with count 2
Thread-1:f2() calling f1() with count 1
Thread-1:f1() calling f2() with count 0
Thread-0:f1() calling f2() with count 9
Thread-0:f2() calling f1() with count 8
Thread-0:f1() calling f2() with count 7
Thread-0:f2() calling f1() with count 6
Thread-0:f1() calling f2() with count 5
Thread-0:f2() calling f1() with count 4
Thread-0:f1() calling f2() with count 3
Thread-0:f2() calling f1() with count 2
Thread-0:f1() calling f2() with count 1
Thread-0:f2() calling f1() with count 0

当时就觉得奇怪,在f1()里面调用了synchronized的f2(),当时只知道是可以,不知道具体原因,现在明白了,因为synchronized是可重入的锁,所以同一个对象的synchronized的方法调用另外一个synchronized方法是不需要再次获取锁的。

synchronized和lock都是可重入的锁,可以防止死锁,相对于可重入的锁有一种自旋锁,后面再做研究。

转载于:https://my.oschina.net/u/1540325/blog/688263

java中可重入锁的学习总结相关推荐

  1. Java 中可重入锁、不可重入锁的测试

    可重入锁 指在同一个线程在外层方法获取锁的时候,进入内层方法会自动获取锁. 为了避免死锁的发生,JDK 中基本都是可重入锁. 下面我们来测试一下 synchronized 和  java.util.c ...

  2. Java ReentrantLock可重入锁的源码深度解析

    Java的ReentrantLock的源码实现,包括加锁.解锁的源码,以及公平性.重入性的实现! 文章目录 1 ReentrantLock的概述 1.1 ReentrantLock的API方法 1.2 ...

  3. Java并发教程–重入锁

    Java的synced关键字是一个很棒的工具–它使我们能够以一种简单可靠的方式来同步对关键部分的访问,而且也不难理解. 但是有时我们需要对同步进行更多控制. 我们要么需要分别控制访问类型(读取和写入) ...

  4. Go语言如何实现可重入锁?

    前言 哈喽,大家好,我是asong.前几天一个读者问我如何使用Go语言实现可重入锁,突然想到Go语言中好像没有这个概念,平常在业务开发中也没有要用到可重入锁的概念,一时懵住了.之前在写java的时候, ...

  5. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等...

    http://blog.51cto.com/13919357/2339446 Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容 ...

  6. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等

    Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互 ...

  7. java代码如何避免死锁,Java可重入锁如何避免死锁

    看到一个问题,Java的可重入锁为什么可以防止死锁呢?网上看了看资料,虽然有答案说出了正确答案,但是分析的不够详细,对初学者不够友好.这里我再做一个更清晰的分析. 首先是示例代码: 1 public ...

  8. java重入锁_java并发编程:可重入锁是什么?

    释义 广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁.ReentrantLock和sync ...

  9. 同步控制 之“重入锁”

    2019独角兽企业重金招聘Python工程师标准>>> 我们首先将介绍synchronized.Object.wait()和Object.notify()方法的替代品(或者说是增强版 ...

最新文章

  1. golang 得到字符串在文件中的行号
  2. 66 Airflow安装与部署
  3. 20145321 《Java程序设计》第7周学习总结
  4. html 分级切换菜单_FL studio系列教程(十六):FL Studio查看菜单讲解
  5. java抓rtp包_Wireshark抓取RTP包,还原语音
  6. 动态表格数据序号从1开始_EXCEL对面的表姐看过来,你真的会给表格添加序号吗?...
  7. 设计模式 C++观察者模式
  8. shell脚本中执行命令_如何在Shell脚本中执行命令?
  9. 核心金融场景分布式事务
  10. ubuntu16.xxx安装mysql5.0项目迁移环境搭建
  11. vbe编程真人小代码
  12. spring开发工具STS下载
  13. Unity Plastic SCM (无法托管/当前仓库地址错误/创建新项目无法托管/由于目标计算机积极无法连接)
  14. 基于服务号的微信扫码关注公众号登录网站原理分析
  15. MT7628处理器介绍,MT7628芯片原理图资料
  16. 抖音小店商品如何挂到精选联盟上面?带货有什么技巧方法?
  17. Linux 下街机模拟器 mame 安装
  18. 韩顺平python教程视频_尚硅谷_韩顺平_Linux_2018Linux基础入门教程全集
  19. SQL Server 设置IP地址登录方法
  20. Android_插值器

热门文章

  1. MySQL 索引 :哈希索引、B+树索引、全文索引
  2. leetcode7 整数反转
  3. 2018第二届河北省大学生程序设计竞赛题解
  4. 《Head First设计模式》第七章-适配器模式、外观模式
  5. Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解
  6. 算法(24)-股票买卖
  7. LeetCode - Medium - 114. Flatten Binary Tree to Linked List
  8. 小米C++开发 面试 准备阶段和部分真题
  9. C++ primer 第15章 面向对象程序设计
  10. 论述HTML5平台的若干重要特性