目录
一.死锁
1.死锁现象
如果出现了同步嵌套,就会很容易产生死锁问题.是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象.简单来说死锁是 两个或者两个以上的线程,在抢占CPU的执行权的时候,都处于等待状态.
public class MyThread extends Thread {
private boolean flag;
public MyThread(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if (flag) {
synchronized (LockUtils.objA) {
System.out.println("true线程进来了持有ObjA锁");
synchronized (LockUtils.objB) {
System.out.println("true线程进来了持有ObjB锁");
}
}
} else {
synchronized (LockUtils.objB) {
System.out.println("false线程进来了持有ObjB锁");
synchronized (LockUtils.objA) {
System.out.println("false线程进来了持有ObjA锁");
}
}
}
}
}
public interface LockUtils {
//定义了两把锁对象
Object objA = new Object();
Object objB = new Object();
}
public class MyTest {
public static void main(String[] args) throws InterruptedException {
//创建了两个线程
MyThread th1 = new MyThread(true);
MyThread th2 = new MyThread(false);
//开启线程
th1.start();
th2.start();
}
}
运行结果便是如此!你等我,我等你.害!孽缘啊!所以一定要注意切勿造成如此"孽缘"!!!!
为了避免死锁,就出现了一个机制:线程间的等待唤醒机制
2.线程间的等待唤醒机制
什么是等待唤醒机制?
这个机制就相当于,生产线程生产出了资源. 也就是有资源了,于是就等着,那不可能一直干等着吧,不通知消费线程,他又怎么知道生产出来了资源!通知后,消费线程便拿到资源,然后消费资源,直到资源没有了,就等着,也不可能干等着吖,得通知生产线程这里没有资源了,需要生产线程去生产.这个 生产线程与消费线程之间的等待与通知对方就比较形象的展示了等待唤醒机制!
生产线程生产出了资源,就会等待消费线程来使用,如果没有通知消费线程,那么消费线程也就会一直等待,因为消费线程并不知道已经有资源了!这样的相互等待就会形成死锁现象!