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

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

hot3.png

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

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

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

1 public class Reentrant{
2     public synchronized outer(){
3         inner();
4     }
5  
6     public synchronized inner(){
7         //do something
8     }
9 }

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

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

01 public class Lock{
02     private boolean isLocked = false;
03     public synchronized void lock()
04         throws InterruptedException{
05         while(isLocked){
06             wait();
07         }
08         isLocked = true;
09     }
10  
11     public synchronized void unlock(){
12         isLocked = false;
13         notify();
14     }
15 }

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

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

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

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

转载于:https://my.oschina.net/Chaos777/blog/269095

你可能感兴趣的文章
linux的functions之daemon函数详解
查看>>
安装jenkins
查看>>
Windows server 2008访问权限应用规则
查看>>
本地YUM源配置-Redhat Enterprise 5.9
查看>>
windows注册表修改同步时间频率
查看>>
ssh框架搭建错误集合
查看>>
《防SSH爆破脚本》
查看>>
路由器本地权限划分--进程赋权
查看>>
【android】使用SharedPreferences存取复杂数据
查看>>
希望这些建议,能推动管理软件开发的规范化进程 (数据库版本、修改记录)
查看>>
VSTS的安装
查看>>
音视频性能指标介绍
查看>>
实战ISA2004+三层交换机实现多VLAN互通(20130327修正部分错误)
查看>>
AS3.0中的显示编程(二)-- DisplayObject类
查看>>
SOA也是一种设计模式
查看>>
当飞鸽传书无法找到别人时… …
查看>>
GPT分区体系
查看>>
搭建nginx服务器nginx-1.6.2.tar.gz
查看>>
如何备份\恢复MDaemon的BES数据库
查看>>
GoldenGate for mysql to mysql:单向同步
查看>>