博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重入锁死
阅读量:5817 次
发布时间:2019-06-18

本文共 1046 字,大约阅读时间需要 3 分钟。

重入锁死与和非常相似。和两篇文章中都有涉及到重入锁死的问题。

当一个线程重新获取,或其他不可重入的同步器时,就可能发生重入锁死。可重入的意思是线程可以重复获得它已经持有的锁。Java的synchronized块是可重入的。因此下面的代码是没问题的:

(译者注:这里提到的锁都是指的不可重入的锁实现,并不是Java类库中的Lock与ReadWriteLock类)

 
public class Reentrant{	public synchronized outer(){		inner();	}	public synchronized inner(){		//do something	}}

注意outer()和inner()都声明为synchronized,这在Java中这相当于synchronized(this)块(译者注:这里两个方法是实例方法,synchronized的实例方法相当于在this上加锁,如果是static方法,则不然,更多阅读:)。 如果某个线程调用了outer(),outer()中的inner()调用是没问题的,因为两个方法都是在同一个管程对象(即this)上同步的。如果一 个线程持有某个管程对象上的锁,那么它就有权访问所有在该管程对象上同步的块。这就叫可重入。若线程已经持有锁,那么它就可以重复访问所有使用该锁的代码 块。

下面这个锁的实现是不可重入的:

 
public class Lock{	private boolean isLocked = false;	public synchronized void lock()		throws InterruptedException{		while(isLocked){			wait();		}		isLocked = true;	}	public synchronized void unlock(){		isLocked = false;		notify();	}}

如果一个线程在两次调用lock()间没有调用unlock()方法,那么第二次调用lock()就会被阻塞,这就出现了重入锁死。

避免重入锁死有两个选择:

  1. 编写代码时避免再次获取已经持有的锁
  2. 使用可重入锁

至于哪个选择最适合你的项目,得视具体情况而定。可重入锁通常没有不可重入锁那么好的表现,而且实现起来复杂,但这些情况在你的项目中也许算不上什么问题。无论你的项目用锁来实现方便还是不用锁方便,可重入特性都需要根据具体问题具体分析。

文章转自

转载地址:http://wuhbx.baihongyu.com/

你可能感兴趣的文章
iOS添加黑色蒙层
查看>>
Hibernate遇到的问题与解决方案
查看>>
hibernate 读取 blob 字段
查看>>
rsync简明手册
查看>>
Oracle存储过程-自定义数据类型,集合,遍历取值
查看>>
在Android上的使用代码覆盖工具
查看>>
MySQLdb安装 and 使用
查看>>
使 KVO在多个ViewController或者对象之间传值
查看>>
我的友情链接
查看>>
Python----Urllib的学习
查看>>
为什么要用二级域名
查看>>
数人云|万字解读:Service Mesh服务网格新生代--Istio
查看>>
SSO学习散记
查看>>
git创建与合并分支
查看>>
特征工程-知识汇总
查看>>
在引入多个包时,出现Unable to merge dex问题
查看>>
PHPECLIPSE插件安装
查看>>
MySQL查找某个字符的位置、截取、长度
查看>>
转PHP 面试题两个
查看>>
JSON日期格式准换
查看>>