多线程出现死锁的原理是什么样的呀!能写个列子吗?感谢!
发生死锁的原因一般是两个对象的锁相互等待造成的。
那么为什么会产生死锁呢?
1.因为系统资源不足。
2.进程运行推进的顺序不合适。
3.资源分配不当。
学过操作系统的朋友都知道:产生死锁的条件有四个:
1.互斥条件:所谓互斥就是进程在某一时间内独占资源。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
package cn.com.wangxiuwei.test;
public class TestThread implements Runnable {
private int istrue = 1;
private Object obj1 = new Object();
private Object obj2 = new Object();
public void run() {
if (istrue == 1) {
synchronized (obj1) {
System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println("1");
}
}
}
if (istrue == 0) {
synchronized (obj2) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
TestThread testThread1= new TestThread();
TestThread testThread2 = new TestThread();
testThread1.istrue = 1;
testThread2.istrue = 0;
Thread thread1 = new Thread(testThread1);
Thread thread2 = new Thread(testThread2);
System.out.println("线程开始!");
thread1 .start();
thread2 .start();
}
}
参见 http://www.iteye.com/problems/102391
非常直白的说:你和你哥哥穿越到石器时代,你哥哥带了一台macbook air,你带了一个移动电源,有一天电脑没电了,你哥哥问你要移动电源用用,你就想:‘除非你先把电脑给我玩两天我就给你电源’。但你哥哥却想的是:‘凭什么我要先给你电脑啊?你要先给我电源我就给你玩’。于是两个人陷入了僵局。你哥哥有电脑但是干不了别的,因为电源在你这呢,但你抱着电源也没用啊,石器时代就这一台电脑,于是你就等他妥协,他也等你妥协,然后你们俩就一直那么等。。。。。