如何写一个死锁程序
线程-A是兔子,线程-B是乌龟,萝卜是lockA,蛋是lockB。兔子和乌龟都想把萝卜和蛋全部拿到。
运行程序,兔子和乌龟不一定谁先跑,兔子先跑,一定能拿到萝卜,乌龟先跑一定能拿到蛋,假如兔子先跑,拿到萝卜以后休息100毫秒,然后再去拿蛋,但是在兔子休息的100毫秒内,乌龟开始跑并且拿到了蛋,乌龟拿到蛋以后,也休息100毫秒,然后再去拿萝卜,但是此时萝卜在兔子手里,乌龟拿不到了,蛋在乌龟手里,兔子也拿不到了,它们就一直等,这种情况就造成了死锁。
public class DeadLockDemo {
public static void main(String[] args) {
Object lockA = new Object();
Object lockB = new Object();
new Thread(new Runnable() {
@Override
public void run() {
String name = Thread.currentThread().getName();
synchronized (lockA) {
System.out.println(name + "got lockA, want get lockB");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println(name + "got lockB");
System.out.println(name + "say Hello!");
}
}
}
}, "线程-A").start();
new Thread(new Runnable() {
@Override
public void run() {
String name = Thread.currentThread().getName();
synchronized (lockB) {
System.out.println(name + "got lockB, want get lockA");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockA) {
System.out.println(name + "got lockA");
System.out.println(name + "say Hello!");
}
}
}
}, "线程-B").start();
}
}
运行结果:
线程-A got lockA, want get lockB
线程-B got lockB, want get lockA
如何避免或者解决死锁:
死锁应当尽量避免,银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。