代码示例
public class DeadLock {
private static Object key = new Object();
private static Object lock = new Object();
/**
* flag = 1时 双线程都未能获取到对方的锁 死锁
* flag = 2时 线程1获取到线程2的锁lock 未发生死锁
* flag = 3时 线程2获取到线程1的锁key 未发生死锁
*/
private static int flag = 1;
public static void main(String[] args) {
//线程1
new Thread() {
@Override
public void run() {
synchronized (key) {
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("线程1获取到锁key 准备获取锁lock");
synchronized (lock) {
while (flag != 2) {
flag = 2;
}
}
}
}
}.start();
//线程2
new Thread() {
@Override
public void run() {
synchronized (lock) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程2获取到锁lock 准备获取锁key");
synchronized (key) {
while (flag != 3) {
flag = 3;
}
}
}
}
}.start();
//线程3
new Thread() {
@Override
public void run() {
try {
Thread.sleep(200);
while (flag == 1) {
Thread.sleep(1000);
System.out.println("双线程都未能获取到对方的锁 死锁");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
while (flag == 2) {
System.out.println("线程1获取到线程2的锁lock 未发生死锁");
break;
}
while (flag == 3) {
System.out.println("线程2获取到线程1的锁key 未发生死锁");
break;
}
}
}.start();
}
}
使用sleep来确保线程1获取到锁key,线程2获取到锁lock。其次,确保线程的有序执行,线程三能够正确的得到返回值。
结果
可以看到无论时间过去多久,双方线程始终无法获取到对方的锁,这种情况就是死锁。
最后就是本人有一个疑惑,一般线程间通信是需要volatile关键字,但本例中我尝试只是使用了static修饰便可以在多线程间获取到正确的值。
本人的猜测是因为static修饰的变量是全局变量,存在于主内存中,其他对象都对其可见,同时由于static的唯一性,多线程之间没有变量副本,所以产生了这种情况。
当然本人了解有限,欢迎各位大牛指点。