- public class TestDeadLock implements Runnable {
-
public int flag = 1; //作用是什么
-
static Object o1 = new Object(); //作用是什么
-
-
static Object o2 = new Object(); //作用是什么
-
-
-
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) {
-
TestDeadLock td1 = new TestDeadLock();
-
TestDeadLock td2 = new TestDeadLock();
-
td1.flag = 1;
-
td2.flag = 0;
-
Thread t1 = new Thread(td1);
-
Thread t2 = new Thread(td2);
-
t1.start();
-
t2.start();
-
-
}
-
}
flag常常做为标示用,显然类中也是
这里是为了让一个类,可以调用两种不同的处理过程
死锁的必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
obj1和obj2是模仿2个资源,这个只要是个静态共享对象都可以
一个线程通过synchronized 锁定自己的资源obj1,
并且需要在后面的过程争取第二个资源obj2,
而第二个线程同理锁定自己的obj2,
然后在后面过程争取第一个资源
因为不剥夺条件,不释放自己,又形成循环争取对方资源的环,
从而形成死锁
阅读(821) | 评论(0) | 转发(0) |