java中可重入锁的学习总结

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

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

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

      再之前的我的博客: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于用户投票的排名算法(一):Delicious和Hacker News

互联网的出现,意味着"信息大爆炸"。 用户担心的,不再是信息太少,而是信息太多。如何从大量信息之中,快速有效地找出最重要的内容,成了互联网的一大核心问题。 各种各样的排名算法,是目前过滤信息…

Windows 下 Python 环境搭建

简述Python 是跨平台的,可以运行在 Windows、Mac OS X 和各种 Linux/Unix 系统上。在学习 Python 之前,首先要搭建 Python 环境。完成后,会得到 Python 解释器(负责运行 Python 程序的),一个命令行交互环境…

面试中关于Java你所需知道的的一切

本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺。 1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什…

利用BBRSACryptor实现iOS端的RSA加解密

背景 RSA这种非对称加密被广泛的运用于网络数据的传输,但其在iOS上很难直接实现,BBRSACryptor框架通过移植openssl实现了iOS端的RSA,本文将介绍如何使用BBRSACryptor生成证书,加载公钥,以及后端如何用php读取证书&…

Linux(Fedora21)安装google chrome浏览器

2019独角兽企业重金招聘Python工程师标准>>> Linux(Fedora21)安装Google Chrome浏览器 qianghaoaho(孤狼) 1.添加google chrome的源: cd /etc/yum.repos.d/ vim chrome.repo添加如下内容: [google64] …

R-大数据分析挖掘(5-R基础回顾)

&#xff08;一&#xff09;R函数 R是一种解析型语言&#xff0c;输入后可直接获取结果 函数&#xff08;输入参数&#xff0c;参数&#xff09; R的函数分为“高级”和“低级函数”     • 高级函数可调用低级函数     • 高级函数称为泛型函数 • 函数名 <-‐…

oracle 中的trunc()函数及加一个月,一天,一小时,一分钟,一秒钟方法

返回处理后的数据&#xff0c;不同于round()&#xff08;对数值进行四舍五入处理&#xff09;&#xff0c;该函数不对指定小数前或后的数值部分进行舍入处理。 语法&#xff1a;trunc(number[,decimals]) 其中&#xff0c;number为待做处理的数值&#xff0c;decimals为需要保留…

直接拿来用!最火的Android开源项目(完结篇)

直接拿来用&#xff01;最火的Android开源项目&#xff08;完结篇&#xff09; 2014-01-06 19:59 4785人阅读 评论(1) 收藏 举报 分类&#xff1a;android 高手进阶教程&#xff08;100&#xff09; 摘要&#xff1a;截至目前&#xff0c;在GitHub“最受欢迎的开源项目”系…

将centos7打造成桌面系统

前言 以下所有操作默认在root权限下执行&#xff0c;桌面环境是kde&#xff0c;使用gnome的也可以参考一下。我收集的以下要用到的一些安装包&#xff0c;360网盘http://yunpan.cn/csMhBAp92vTgN 提取码 92e2以下要用的安装软件语法&#xff1a;通过软件源在线安装&#xff1a;…

(八)企业部分之nginx+tomcat+memcached负载均衡集群搭建

【server1】vim /usr/local/lnmp/tomcat/conf/context.xml<Context>......<Manager className"de.javakaffee.web.msm.MemcachedBackupSessionManager"memcachedNodes"n1:172.25.45.1:11211,n2:172.25.45.2:11211"failoverNodes"n1"req…

C++ 虚函数经典深入解析

from&#xff1a;https://blog.csdn.net/gggg_ggg/article/details/45915505C中的虚函数的作用主要是实现了多态的机制。 关于多态&#xff0c;简而言之就是用父类型别的指针指向其子类的实例&#xff0c;然后通过父类的指针调用实际子类的成员函数。 这种技术可以让父类的指针…

理解C++中拷贝构造函数

拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同样对象&#xff0c;是一种特殊的构造函数&#xff0c;具有一般构造函数的所有特性&#xff0c;当创建一个新对象的时候系统会自动调用它&#xff1b;其形参是本类对象的引用&#xff0c;它的特殊功能是将参数代表的…

IDEA mybatis-generator-maven-plugin 插件的使用

2019独角兽企业重金招聘Python工程师标准>>> pom.xml中添加插件 <plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><configuratio…

webpack进阶之插件篇

上一篇博客讲解了webpack环境的基本&#xff0c;这一篇讲解一些更深入的内容和开发技巧。基本环境搭建就不展开讲了 一、插件篇 1. 自动补全css3前缀 autoprefixer 官方是这样说的&#xff1a;Parse CSS and add vendor prefixes to CSS rules using values from the Can I Use…

QT:QObject 简单介绍

QObject 是所有Qt对象的基类。QObject 是Qt模块的核心。它的最主要特征是关于对象间无缝通信的机制&#xff1a;信号与槽。 使用connect()建立信号到槽的连接&#xff0c;使用disconnect()销毁连接&#xff0c;使用blockSignals()暂时阻塞信号以避免无限通知循环&#xff0c;使…

C++中基类的析构函数为什么要用virtual虚析构函数

from&#xff1a;https://blog.csdn.net/iicy266/article/details/11906457知识背景要弄明白这个问题&#xff0c;首先要了解下C中的动态绑定。 关于动态绑定的讲解&#xff0c;请参阅&#xff1a; C中的动态类型与动态绑定、虚函数、多态实现 正题直接的讲&#xff0c;C中基类…

C++中static关键字作用总结

from&#xff1a;https://www.cnblogs.com/songdanzju/p/7422380.html1.先来介绍它的第一条也是最重要的一条&#xff1a;隐藏。&#xff08;static函数&#xff0c;static变量均可&#xff09; 当同时编译多个文件时&#xff0c;所有未加static前缀的全局变量和函数都具有全局…

C Primer Plus 第7章 C控制语句:分支和跳转 7.4 一个统计字数的程序

2019独角兽企业重金招聘Python工程师标准>>> 首先&#xff0c;这个程序应该逐个读取字符&#xff0c;并且应该有些方法判断何时停止&#xff1b;第二&#xff0c;它应该能够识别并统计下列单位&#xff1a;字符、行和单词。下面是伪代码描述&#xff1a; read a cha…

收集整理的非常有用的PHP函数

为什么80%的码农都做不了架构师&#xff1f;>>> 1、PHP加密解密 2、PHP生成随机字符串 3、PHP获取文件扩展名&#xff08;后缀&#xff09; 4、PHP获取文件大小并格式化 5、PHP替换标签字符 6、PHP列出目录下的文件名 7、PHP获取当前页面URL 8、PHP强制下载文件 9、…

进程间的通信方式——pipe(管道)

from&#xff1a;https://blog.csdn.net/skyroben/article/details/715133851.进程间通信每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到&#xff0c;所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内…