java代码实现一个死锁 java简单实现死锁

java如何重现死锁以下是一个简单的死锁例子,程序说明都写着类的注释里了,有点罗嗦,但是应该也还是表述清楚了的 。
/**
* 一个简单的死锁类
* @author iStar
* 当类的对象flag=1时(T1),先锁定O1,睡眠500毫秒,然后锁定O2;
* 而T1在睡眠的时候另一个flag=0的对象(T2)线程启动,先锁定O2,睡眠500毫秒,等待T1释放O1;
* T1睡眠结束后需要锁定O2才能继续执行,而此时O2已被T2锁定;
* T2睡眠结束后需要锁定O1才能继续执行,而此时O1已被T1锁定;
【java代码实现一个死锁 java简单实现死锁】* T1、T2相互等待 , 都需要对方锁定的资源才能继续执行 , 从而死锁 。
*/
class DeadLock implements Runnable {
public int flag = 1;
static Object o1 = new Object(), o2 = new Object();
@Override
public void run() {
System.out.println("flag=" + flag);
if(flag == 1) {
synchronized(o1) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized(o2) {
System.out.println("1");
}
}
}
if(flag == 0) {
synchronized(o2) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
DeadLock td1 = new DeadLock();
DeadLock td2 = new DeadLock();
td1.flag = 1;
td2.flag = 0;
new Thread(td1).start();
new Thread(td2).start();
}
}
java 死锁死锁
死锁是这样一种情形:多个线程同时被阻塞 , 它们中的一个或者全部都在等待某个资源被释放 。由于线程被无限期地阻塞,因此程序不可能正常终止 。
导致死锁的根源在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问 。“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权 。当线程访问对象时 , 线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁 。
由于这个原因 , 在使用“synchronized”关键词时,很容易出现两个线程互相等待对方做出某个动作的情形 。代码一是一个导致死锁的简单例子 。
//代码一
class Deadlocker {
int field_1;
private Object lock_1 = new int[1];
int field_2;
private Object lock_2 = new int[1];
public void method1(int value) {
“synchronized” (lock_1) {
“synchronized” (lock_2) {
field_1 = 0; field_2 = 0;
}
}
}
public void method2(int value) {
“synchronized” (lock_2) {
“synchronized” (lock_1) {
field_1 = 0; field_2 = 0;
}
}
}
}
参考代码一,考虑下面的过程:
◆ 一个线程(ThreadA)调用method1() 。
◆ ThreadA在lock_1上同步,但允许被抢先执行 。
◆ 另一个线程(ThreadB)开始执行 。
◆ ThreadB调用method2() 。
◆ ThreadB获得lock_2,继续执行,企图获得lock_1 。但ThreadB不能获得lock_1,因为ThreadA占有lock_1 。
◆ 现在 , ThreadB阻塞 , 因为它在等待ThreadA释放lock_1 。
◆ 现在轮到ThreadA继续执行 。ThreadA试图获得lock_2 , 但不能成功 , 因为lock_2已经被ThreadB占有了 。
◆ ThreadA和ThreadB都被阻塞,程序死锁 。
当然,大多数的死锁不会这么显而易见,需要仔细分析代码才能看出,对于规模较大的多线程程序来说尤其如此 。好的线程分析工具,例如JProbe Threadalyzer能够分析死锁并指出产生问题的代码位置 。

推荐阅读