死锁
死锁发生的情况:创建两个字节数组LockA和LockB,再创建两个线程A和B,让每个线程都用synchronized锁住字节数组(A先锁LockA,再尝试去锁定LockB;B先锁LockB,再尝试锁定锁定LockA),如果A锁住LockA,B锁住LockB,A就没办法锁住LockB,B也没办法锁住LockB,两者相互等待,这时就陷入了死锁。
代码示例
package cn.edu.pzhu;
public class DeadLock {
//这种定义从一个大佬那儿学的
public static byte LockA[] = new byte[0];
public static byte LockB[] = new byte[0];
public static void main(String[] args) {
new Thread(new A()).start();
new Thread(new B()).start();
}
}
class A implements Runnable {
@Override
public void run() {
try {
System.out.println("A 准备锁定 LockA");
synchronized (DeadLock.LockA) {
System.out.println("A 把 LockA 锁定");
Thread.sleep(1000); // 让A等一会,让B有时间锁定LockB
System.out.println("A 尝试锁定 LockB");
synchronized (DeadLock.LockB) {
System.out.println("A 把LockB锁定");
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("A的锁释放");
}
}
class B implements Runnable {
@Override
public void run() {
try {
System.out.println("LockB 准备锁定");
synchronized (DeadLock.LockB) {
System.out.println("B 把 LockB 锁定");
System.out.println("B 尝试锁定 LockA");
synchronized (DeadLock.LockA) {
System.out.println("B 把 LockA 锁定 ");
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("B的锁释放");
}
}
运行结果
如有不当之处欢迎指出!