死锁:当一个线程等待由另一个线程持有锁,而后者正在等待已被第一个线程持有的锁,就会发生死锁。
程序员为啥要关注这个死锁问题呢?
这就是因为神秘的JAVA虚拟机(JVM)不检测也不试图避免这种情况。
程序员为啥要关注这个死锁问题呢?
这就是因为神秘的JAVA虚拟机(JVM)不检测也不试图避免这种情况。
案例:
public class DeadLock {
public void testDealLock() {
MyThread mt = new MyThread();
new Thread(mt).start();
new Thread(mt).start();
}
//test
public static void main(String[] args) {
new DeadLock().testDealLock();
}
//内部类
class MyThread implements Runnable{
//资源
private Object object1 = new Object();
private Object object2 = new Object();
private boolean flag = true;
@Override
public void run() {
if (flag) {
flag = false;
synchronized (object1) {
System.out.println(Thread.currentThread().getName() + " object1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object2) {
System.out.println(Thread.currentThread().getName() + " object2");
}
}
} else {
flag = true;
synchronized (object2) {
System.out.println(Thread.currentThread().getName() + " object2--");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object1) {
System.out.println(Thread.currentThread().getName() + " object1--");
}
}
}
}
}
}
public void testDealLock() {
MyThread mt = new MyThread();
new Thread(mt).start();
new Thread(mt).start();
}
//test
public static void main(String[] args) {
new DeadLock().testDealLock();
}
//内部类
class MyThread implements Runnable{
//资源
private Object object1 = new Object();
private Object object2 = new Object();
private boolean flag = true;
@Override
public void run() {
if (flag) {
flag = false;
synchronized (object1) {
System.out.println(Thread.currentThread().getName() + " object1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object2) {
System.out.println(Thread.currentThread().getName() + " object2");
}
}
} else {
flag = true;
synchronized (object2) {
System.out.println(Thread.currentThread().getName() + " object2--");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object1) {
System.out.println(Thread.currentThread().getName() + " object1--");
}
}
}
}
}
}
--结果
Thread-0 object1
Thread-1 object2--
Thread-1 object2--
原因是:
第一个线程获取object1的锁后,进入休眠状态,放弃cup使用权但不是释放锁
第二个线程获取object2的锁后,进入休眠状态,放弃cup使用权但不是释放锁
第一个线程休眠结束,准备获取object2资源,发现object2资源被第二个线程锁住,那么就开始等待
第二个线程休眠结束,准备获取object1资源,发现object1资源被第一个线程锁住,也开始等待
就这样,你等待我,我等待你,大家玩完,变成了死锁