1、什么是线程死锁?
两个或者两个以上的线程在执行的过程中,因抢夺资源而造成相互等待的现象,在没有外界干扰的情况下,这些线程会一直处于等待状态,例如线程A已经占用了资源1,同时还在申请资源2,线程B已经占用了资源2,但同时还在申请资源1,因此线程A和线程B因相互等对方已占有的资源而处于相互等待而进入死锁状态。
2、产生死锁的条件
产生死锁有四个跳进:1、互斥条件,即线程对已获得的资源进行排他作用,即该线程已经占用了资源,其他线程如果想要获得资源必须等待,直到占有资源的线程释放了资源占有,其他线程才有可能获得资源
2、请求并持有条件,即一个线程已经占有了一个资源,但同时还在申请新的资源,而新的资源又被其他资源占用,所以该线程会被阻塞起来,但是该线程在等待的过程中不会释放已经占有的资源
3、不可剥夺条件,即一个线程占有了资源,在自己释放资源之前,其他线程不可获得该资源,只有等到该线程释放资源后,其他线程才有获取该资源的资格
4、环形等待条件,即在发生死锁时肯定会出现这样的情况,例如线程集合{T1,T2,T3,T4,....,TN},T1等待T2占有的资源,T2等待T3占有的资源,T3等待T4占有的资源....,TN等待T1占有的资源。代码如下
package com.yfq.demo3;
/**
* @author YuanFengQiqo
* @date 2019/3/26 22:27
*/
@SuppressWarnings(value = "all")
public class ThreadWait {
private static final Object object1=new Object();
private static final Object object2=new Object();
public static void main(String[] args) {
Thread thread1=new Thread(new Runnable() {
@Override
public void run() {
synchronized (object1){
System.out.println(Thread.currentThread().getName()+"获取到了object1的资源");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在等待获取到了object2的资源");
synchronized (object2){
System.out.println(Thread.currentThread().getName()+"获取到了object2的资源");
}
}
}
},"线程1");
Thread thread2=new Thread(new Runnable() {
@Override
public void run() {
synchronized (object2){
System.out.println(Thread.currentThread().getName()+"获取到了object2的资源");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在等待获取到了object1的资源");
synchronized (object1){
System.out.println(Thread.currentThread().getName()+"获取到了object1的资源");
}
}
}
},"线程2");
thread1.start();
thread2.start();
}
}
|