不可重入锁/自旋锁、可重入锁
来源:互联网 发布:firefly ubuntu 编辑:程序博客网 时间:2024/06/05 08:09
转载自:http://blog.csdn.net/soonfly/article/details/70918802
锁分为可重入锁和不可重入锁。
可重入和不可重入的概念是这样的:当一个线程获得了当前实例的锁,并进入方法A,这个线程在没有释放这把锁的时候,能否再次进入方法A呢?
- 可重入锁:可以再次进入方法A,就是说在释放锁前此线程可以再次进入方法A(方法A递归)。
- 不可重入锁(自旋锁):不可以再次进入方法A,也就是说获得锁进入方法A是此线程在释放锁钱唯一的一次进入方法A。
先举例来说明锁的可重入性:
outer中调用了inner,outer先锁住了lock,这样inner就不能再获取lock。其实调用outer的线程已经获取了lock锁,但是不能在inner中重复利用已经获取的锁资源,这种锁即称之为 不可重入 。通常也称为 自旋锁 。相对来说,可重入就意味着:线程可以进入任何一个它已经拥有的锁所同步着的代码块。
不可重入锁基本原理:
可以看到,当isLocked被设置为true后,在线程调用unlock()解锁之前不管线程是否已经获得锁,都只能wait()。
代码如下:
可重入锁的基本原理
我们修改Lock,加入一个变量lockBy用来保存已经获得锁的线程,这样就能对有锁的线程放行。
解释一下程序中的两个变量:
lockBy:保存已经获得锁实例的线程,在lock()判断调用lock的线程是否已经获得当前锁实例,如果已经获得锁,则直接跳过while,无需等待。
lockCount:记录同一个线程重复对一个锁对象加锁的次数。否则,一次unlock就会解除所有锁,即使这个锁实例已经加锁多次了。
在java 中,synchronized和java.util.concurrent.locks.ReentrantLock是可重入锁。
阅读全文
0 0
- 不可重入锁/自旋锁、可重入锁
- Java多线程/并发10、不可重入锁/自旋锁、可重入锁
- 不可睡眠锁:自旋锁spinlock编码学习
- 可重入锁与自旋锁
- linux内核锁机制实例代码-不可睡眠锁之自旋锁之一
- linux内核锁机制实例代码-不可睡眠锁之自旋锁之二
- linux内核锁机制实例代码-不可睡眠锁之自旋锁之二
- 自旋锁
- 自旋锁
- 自旋锁
- 自旋锁
- 自旋锁
- 自旋锁
- 自旋锁
- 自旋锁
- 自旋锁
- 自旋锁
- 自旋锁
- 通过epel安装htop进行系统进程查看
- 一个Tomcat配置多个端口
- 理解restful架构
- 数字碰撞
- nodejs的cookie和session
- 不可重入锁/自旋锁、可重入锁
- 成为java高级工程师需要什么
- 笔记——优先队列(常用)
- 斗鱼大数据的玩法
- 星期转换Date格式错误
- Hdu_6166多源多汇最短路
- (lintcode)第454题 矩阵面积
- 【bzoj2049】[Sdoi2008]Cave 洞穴勘测
- HDU-6162---Ch’s gift (树链剖分+离线)(2017多校9)