举个例子说明下,
怎样才会发生死锁呢?
怎样才会发生死锁呢?
解决方案 »
- java有没有清除当前输出的方法?
- 学习Java中遇到的一个疑惑
- 纯java代码实现从Access数据库查出数据后导入word文档?
- 帮助解释一下这个程序,谢谢(国外大学大一Java的考试题 (00年)
- 看下这个组合算法,java里写算法真不容易
- 如何在点击窗口(类型是JFrame)那个叉叉关闭的时候跳出消息框?
- 关于全文检索工具lucene中怎样维护索引库.如何更新和删除一条索引,我眯了好久了,没找着答案.熟悉lucene的请进来拉我一把.
- 我在eclipse下输入中文注释,为什么都变成了乱码“方块”?
- 请教,applet中可以显示出jdbTable,可却死活不显示jdbnavToolBar控件?
- jps1.1.2(java pet store)问题
- 能否判断一个类变量(公有)正在被访问?
- 关于计算机 维护 书籍
由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。
一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。
计算机系统中,如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。例如,
进程1,2分别完全占有两种系统资源A和B,它们的进程操作分别如下(从左到右:
1:获得A资源,获得B资源,释放A资源,释放B资源;
2:获得B资源,获得A资源,释放B资源,释放A资源;
从1来看,它要获得B资源才会释放A资源,而获得A资源正是进程2释放B资源的条件,所以两个进程互相等待,进入死锁 下面的代码就发生了死锁。/**
* @author bzwm
*
*/
public class Deadlock {
public static void main(String args[])
{
final ThreadImp imp = new ThreadImp();
//启动线程执行method1
new Thread(new Runnable() {
public void run() {
imp.method1();
}
}).start(); //启动线程执行method2
new Thread(new Runnable() {
public void run() {
imp.method2();
}
}).start(); }
}class ThreadImp
{
private Object lock1 = new Object();
private Object lock2 = new Object();
public void method1()
{
System.out.println("---Method1 需要lock1锁---");
synchronized (lock1)
{
System.out.println("---Method1 获得lock1锁---");
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
System.out.println("method1睡好了,准备执行invokeByMethod1");
invokeByMethod1();
}
System.out.println("---Method1 释放lock1锁---");
}
private void invokeByMethod1()
{
System.out.println("---invokeByMethod1 需要lock2锁---");
synchronized (lock2)
{
System.out.println("invokeByMethod1获得lock2锁,准备执行method2");
}
System.out.println("---invokeByMethod1 释放lock2锁---");
}
public void method2()
{
System.out.println("###Method2 需要lock2锁###");
synchronized (lock2)
{
System.out.println("###Method2 获得lock2锁###");
System.out.println("method2获得lock2锁,然后执行invokeByMethod2");
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
invokeByMethod2();
}
System.out.println("###Method2 释放lock2锁###");
}
private void invokeByMethod2()
{
System.out.println("---invokeByMethod2 需要lock1锁---");
synchronized (lock1)
{
System.out.println("invokeByMethod2获得lock1锁");
}
System.out.println("---invokeByMethod2 释放lock1锁---");
}
}
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。