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;
/**
*
*
*
相关文档:
一、Annotation究竟是什么?
Annotation 提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、类型、构造方法、方法、成员变量、参数、本地变量的声明中。这些信息被存储在annotation的“name=value”结构对中 ......
Hibernate
之父 Gavin King[1]建议开发者升级到 Java EE 6 平台,并指出了一些不愿意升级的观点其实是没有根据的。
Java EE 6 发布后,我看到了很多反对升级到新平台的观点。这些反对观点大多是由 Tomcat
/ Jetty 以及一些开源框架(例如 Hibernate 与 Spring)的使用者提出。
&n ......
一 线程的基本概念
线程是一个程序内部的顺序控制流.一个进程相当于一个任务,一个线程相当于一个任务中的一条执行路径.
多进程:在操作系统中能同时运行多个任务(程序)
多线程:在同一个应用程序中有多个顺序流同时执行
Java的线程是通过java.lang.Thread类来实现的
JVM启动时会有一个由主方法(public static void main( ......
在非java虚拟机下运行matlab据说可以扩大内存,启动非java虚拟机下运行 matlab的方法有:
一.
1、右建点matlab快捷方式,选属性 ......
通过Web Service混合.NET和Java技术往往很容易,但Web Service并非是.NET和Java互操作的万灵丹。Web Service在集成独立的跨网络通信的组件时非常有用,在简单的调用/返回情景中,涉及的数据类型数量非常有限,且Web Service是基于标准的,混合.NET和Java技术通常显得很简单,因此有人认为Web Serv ......