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,一经查实,立即删除!

相关文章

Oracle DB优化

http://www.jb51.net/article/77876.htm http://www.jb51.net/article/56881.htm http://danni505.blog.51cto.com/15547/1163711/ http://blog.csdn.net/giianhui/article/details/8172786转载于:https://www.cnblogs.com/diyunpeng/p/5132392.html

设置View单个圆角

#pragma mark - 设置View单个圆角 (void)addCornerWithView:(UIView *)aView type:(UIRectCorner)aCorners size:(CGSize)aSize { // 根据矩形画带圆角的曲线 UIBezierPath *maskPath [UIBezierPath bezierPathWithRoundedRect:aView.bounds byRoundingCorners:aCorn…

Python 数据类型

简述Python 中的每个值都有一个数据类型。在 Python 编程中,一切(万物)皆对象,数据类型实际上是类,变量是这些类的实例(对象)。简述数据类型Number数字String字符串List列表Tuple元组Set集合Dic…

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

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

iOS 修改工程名

一两个月之前,公司要求将现在的项目(发货端和接单端在一个项目里),拆分成两个项目分别是接单端项目和发货端项目,原有的项目还不能下架。这种情况就要考虑苹果审核查代码的重复率的问题了。老板的要求除了改变项目的主…

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读取证书&…

UIView转UIimage

/** 将 UIView 转换成 UIImage param view 将要转换的View return 新生成的 UIImage 对象 */ - (UIImage *)yj_convertCreateImageWithUIView:(UIView *)view{ UIGraphicsBeginImageContext(view.bounds.size); CGContextRef ctx UIGraphicsGetCurrentContext…

Linq 合并数据并相加

有几条数据是这样的 Person 123 456 789 Person 321 654 987 想合并成 Person 444 1110 1776 直接一条linq搞定 var newQuery from p in query group p by p.Name into gselect new { Name g.Name, Value g.Sum(x > x.Value) }; 转…

python 各种模块学习

from:https://blog.csdn.net/weiwangchao_/article/details/70570508转载:。。。。Python的模块大全,很全,有详细介绍!另外附Python两个教程1. Python详细教程(廖雪峰的官方网站,语言简洁&#…

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的函数分为“高级”和“低级函数”     • 高级函数可调用低级函数     • 高级函数称为泛型函数 • 函数名 <-‐…

jquery点击label触发2次的问题

今天写问卷的时候遇到个label点击的时候&#xff0c;监听的click事件被执行两次&#xff1b;产生这个的原因么。。。事件冒泡 <div class"questionBox checkBox"><div class"title"> 2.你如何理解创新意识的重要性?</div><div class…

git本地项目管理

Git 基本工作流程 | git仓库 | 暂存区 | 工作目录 | | ---------------- | ------------------ | ------------------- | | 用于存放提 交记录 | 临时存放被修改文件 | 被Git管理的项目目录 | Git 的使用 1.5.1 Git 使用前配置 在使用 git 前&#xff0c;需要告诉 git 你…

Python中self用法详解

在介绍Python的self用法之前&#xff0c;先来介绍下Python中的类和实例…… 我们知道&#xff0c;面向对象最重要的概念就是类&#xff08;class&#xff09;和实例&#xff08;instance&#xff09;&#xff0c;类是抽象的模板&#xff0c;比如学生这个抽象的事物&#xff0c;…

siwft初学(一)

今天刚開始学习swift语言。首先须要下载xcode6 beta版本号。正式版本号然后会公布。自己学习总结一下&#xff0c;假设有误。请大家指出。 创建project的时候。language选择swift语言。 swift语言比起c&#xff0c;oc很的简洁。開始真有点不适应&#xff0c;没有main函数&#…

python简单爬虫(一)

学习python前纠结了下&#xff0c;到底是应该一个个知识点吃透&#xff0c;然后写些小程序。还是应该快速掌握基础语法&#xff0c;快速实践。思考后认为前者这么学习速度真心不高&#xff0c;于是花2天时间看了下python3的语法&#xff0c;虽然很多都不明白&#xff0c;但是带…

Github远程仓库管理

1. Github 在版本控制系统中&#xff0c;大约90%的操作都是在本地仓库中进行的&#xff1a;暂存&#xff0c;提交&#xff0c;查看状态或者历史记录等等。除此之外&#xff0c;如果仅仅只有你一个人在这个项目里工作&#xff0c;你永远没有机会需要设置一个远程仓库。 只有当…