举个例子说明下,
怎样才会发生死锁呢?
怎样才会发生死锁呢?
解决方案 »
- 为什么IOException需要引IO包
- 求助:在带有checkbox的jtree上,点击图标,checkbox组件消失
- JSP将查询出来的结果集写入到CSV文件
- Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
- 用JAVA语言存数据到Oracle中,select出来的都是乱码?
- JAVA中如何提高查询数据库的速度
- String args[]和String []args有什么区别????
- 如何动态改变JTable的大小
- 我在csdn学会了第一个HelloWorld
- 出学java各位请帮忙,来着有分!
- 能否判断一个类变量(公有)正在被访问?
- 关于计算机 维护 书籍
由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。
一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程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) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。