Java 多线程编程之七:死锁(附源代码)
Java 多线程编程之七:死锁(附源代码)
源代码下载
多线程编程中,线程死锁也是一个比较有趣的问题。然而死锁发生的可能性很小,正因如此,大家可能对此不是很熟悉。但是死锁并不是不重要,因为它确确实实存在着,随时会出现在我们的程序之中。很多朋友面试的时候都遇到过这样类似的一个编程题:使用 Java 写一个死锁。问题不是很难,但是由于大家现实中处理的比较少,还真难住了一部分人。本文列举了一个简单但又不失为经典的死锁的源代码,并解释了死锁发生的原因。相信读者看过之后对死锁会有更进一步的认识!
死锁发生的原因一般是两个对象的锁相互等待造成的。比如线程 1 先拿到了对象 A 的对象锁,线程 2 先拿到了对象 B 的对象锁。线程 1 这时候要求拿到对象 B 的对象锁,因为对象 B 的对象锁暂时被线程 2 所持有,所以线程 1 只能抱着对象 A 的对象锁等待线程 2 释放掉对象 B 的对象锁。而如果这个时候,持有对象 B 的对象锁的线程 2 要求访问对象 A 的对象锁,因为对象 A 的对象锁暂时被线程 1 所持有,所以线程 2 只能抱着对象 B 的对象锁等待线程 1 释放掉对象 A 的对象锁。这个时候两个线程就陷入了互相等待的僵局之中。程序就进入了死锁的状态,除非你手工停掉这个程序,否则它将永久地僵持下去。
是不是有点绕?嘿嘿,如果你弄明白了对象锁的概念,死锁的原因也就一目了然。关于对象锁,作者在上一篇博客《Java 多线程编程之六:线程之间的通信(附源代码)
》中有所介绍,这里就不再赘述了。
用代码说明问题,直接看代码演示。
死锁例子-资源源代码
package com.defonds.deadlock;
/**
*
*
* 项目名称:ThreadDeadLock
* 类名称:Resource
* 类描述:资源类,用于代表线程竞争的数据资源
* 创建人:Defonds
* 创建时间:2010-1-26 下午02:01:16
* 修改人:Defonds
* 修改时间:2010-1-26 下午02:01:16
* 修改备注:
* @version
*
*/
public class Resource {
private int value;//资源的属性
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
死锁例子-资源管理器源代码
package com.defonds.deadlock;
/**
*
*
*
相关文档:
Map、Set、Iterator迭代详解
Map接口定义了四种类型的方法,每个Map都包含这些方法。
equals(Object o)比较指定对象与此Map的等价性。
hashCode()返回此Map的哈希码。
Map定义了几个用于插放和删除元素的变换方法。
remove(Object key) 从Map中删除键和关联的值。
put(object key,Object value) 将指定值与指定键相关 ......
在非java虚拟机下运行matlab据说可以扩大内存,启动非java虚拟机下运行 matlab的方法有:
一.
1、右建点matlab快捷方式,选属性 ......
通过Web Service混合.NET和Java技术往往很容易,但Web Service并非是.NET和Java互操作的万灵丹。Web Service在集成独立的跨网络通信的组件时非常有用,在简单的调用/返回情景中,涉及的数据类型数量非常有限,且Web Service是基于标准的,混合.NET和Java技术通常显得很简单,因此有人认为Web Serv ......
这样一来,Delphi使用Webservice和JAVA通讯时,可以将DELPHI的时间直接传给JAVA。从而免去了时间字符串parse之间的消耗,提高的程序效率。
Delphi时间实质就是double类型,整数部分表示天,小数部分表示当天时间,每毫秒为1/86400000。考虑到时区的转换后,JAVA和DELPHI时间之间的转换类如下:
import java.util.Calendar ......