死锁练习
Topic source1. 死锁就像两个人A和B分别从正反两个方向过两截独木桥1-2
a) 当A和B分别占用独木桥的1或2,这时必在独木桥中间相遇
b) 这时,除非一方主动回退,否则两者将死锁在桥中央
这也是天龙八部中的经典桥段
2. 如果一个系统中两个线程反向请求两个独占的资源,且同时占有两个资源后才愿意释放,那就可能发生死锁。
- 1
1. 死锁就像两个人A和B分别从正反两个方向过两截独木桥1-2
a) 当A和B分别占用独木桥的1或2,这时必在独木桥中间相遇
b) 这时,除非一方主动回退,否则两者将死锁在桥中央
这也是天龙八部中的经典桥段
2. 如果一个系统中两个线程反向请求两个独占的资源,且同时占有两个资源后才愿意释放,那就可能发生死锁。
Junes_99994
public class Main {
static final Object[] LOCKs = { new Object(), new Object(), new Object(), new Object() };
public static void main(String[] args) {
new MyThread(1, LOCKs, true, 2).start();
new MyThread(2, LOCKs, false, 3).start();
}
}
class MyThread extends Thread {
private String tName;
private boolean dir;
private Object[] lockArr;
private int locknum;
public MyThread(Object tName, Object[] lockArr, boolean dir, int locknum) {
this.tName = this.getClass().getSimpleName() + tName.toString();
this.dir = dir;
this.lockArr = lockArr;
this.locknum = locknum;
}
public void syncIterate(int lockIndex) {
Object lock;
if (lockIndex < lockArr.length && lockIndex >= 0 && locknum > 0) {
lock = lockArr[lockIndex];
locknum--;
} else {
return;
}
System.out.println(tName + ": try get lock " + (lockIndex + 1) + " ...");
synchronized (lock) {
System.out.println(tName + ": lock " + (lockIndex + 1) + " got.");
try {
Thread.sleep(300 + (int) (Math.random() * 1000));
} catch (InterruptedException e) {
System.out.println(e);
}
syncIterate(lockIndex + (this.dir ? 1 : -1));
System.out.println(tName + ": lock " + (lockIndex + 1) + " releasing.");
}
}
public void run() {
syncIterate(dir ? 0 : lockArr.length - 1);
}
}