java并发基础之死锁

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();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值