java中可重入锁的学习总结
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中可重入锁的学习总结相关推荐
- Java 中可重入锁、不可重入锁的测试
可重入锁 指在同一个线程在外层方法获取锁的时候,进入内层方法会自动获取锁. 为了避免死锁的发生,JDK 中基本都是可重入锁. 下面我们来测试一下 synchronized 和 java.util.c ...
- Java ReentrantLock可重入锁的源码深度解析
Java的ReentrantLock的源码实现,包括加锁.解锁的源码,以及公平性.重入性的实现! 文章目录 1 ReentrantLock的概述 1.1 ReentrantLock的API方法 1.2 ...
- Java并发教程–重入锁
Java的synced关键字是一个很棒的工具–它使我们能够以一种简单可靠的方式来同步对关键部分的访问,而且也不难理解. 但是有时我们需要对同步进行更多控制. 我们要么需要分别控制访问类型(读取和写入) ...
- Go语言如何实现可重入锁?
前言 哈喽,大家好,我是asong.前几天一个读者问我如何使用Go语言实现可重入锁,突然想到Go语言中好像没有这个概念,平常在业务开发中也没有要用到可重入锁的概念,一时懵住了.之前在写java的时候, ...
- Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等...
http://blog.51cto.com/13919357/2339446 Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容 ...
- Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等
Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互 ...
- java代码如何避免死锁,Java可重入锁如何避免死锁
看到一个问题,Java的可重入锁为什么可以防止死锁呢?网上看了看资料,虽然有答案说出了正确答案,但是分析的不够详细,对初学者不够友好.这里我再做一个更清晰的分析. 首先是示例代码: 1 public ...
- java重入锁_java并发编程:可重入锁是什么?
释义 广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁.ReentrantLock和sync ...
- 同步控制 之“重入锁”
2019独角兽企业重金招聘Python工程师标准>>> 我们首先将介绍synchronized.Object.wait()和Object.notify()方法的替代品(或者说是增强版 ...
最新文章
- golang 得到字符串在文件中的行号
- 66 Airflow安装与部署
- 20145321 《Java程序设计》第7周学习总结
- html 分级切换菜单_FL studio系列教程(十六):FL Studio查看菜单讲解
- java抓rtp包_Wireshark抓取RTP包,还原语音
- 动态表格数据序号从1开始_EXCEL对面的表姐看过来,你真的会给表格添加序号吗?...
- 设计模式 C++观察者模式
- shell脚本中执行命令_如何在Shell脚本中执行命令?
- 核心金融场景分布式事务
- ubuntu16.xxx安装mysql5.0项目迁移环境搭建
- vbe编程真人小代码
- spring开发工具STS下载
- Unity Plastic SCM (无法托管/当前仓库地址错误/创建新项目无法托管/由于目标计算机积极无法连接)
- 基于服务号的微信扫码关注公众号登录网站原理分析
- MT7628处理器介绍,MT7628芯片原理图资料
- 抖音小店商品如何挂到精选联盟上面?带货有什么技巧方法?
- Linux 下街机模拟器 mame 安装
- 韩顺平python教程视频_尚硅谷_韩顺平_Linux_2018Linux基础入门教程全集
- SQL Server 设置IP地址登录方法
- Android_插值器
热门文章
- MySQL 索引 :哈希索引、B+树索引、全文索引
- leetcode7 整数反转
- 2018第二届河北省大学生程序设计竞赛题解
- 《Head First设计模式》第七章-适配器模式、外观模式
- Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解
- 算法(24)-股票买卖
- LeetCode - Medium - 114. Flatten Binary Tree to Linked List
- 小米C++开发 面试 准备阶段和部分真题
- C++ primer 第15章 面向对象程序设计
- 论述HTML5平台的若干重要特性