08_死锁-产生与解决

死锁——产生与解决

1、死锁

多个线程各自占用一些资源,并且相互等待其他线程占用的资源才能进行,而导致两个或多个线程都在等待对方释放资源,所以度停止执行了。

产生的原因:

过多的同步可能造成死锁

某一个同步块同时拥有两个以上对象的锁时,就可能发生死锁问题

死锁出现的情况:

package com.tsymq.thread.concurrnet;

public class DeadLock {
    public static void main(String[] args) {
        TeamMember tm1 = new TeamMember(1, "五五开");
        TeamMember tm2 = new TeamMember(2, "蛇哥");
        tm1.start();
        tm2.start();
    }
}

class AWM{}

class Scope8{}

class TeamMember extends Thread {
    static AWM awm = new AWM();
    static Scope8 scope8 = new Scope8();
    private String name;
    private int component;

    public TeamMember(int component, String name) {
        super(name);
        this.name = name;
        this.component = component;
    }

    @Override
    public void run() {
        pickup();
    }

    public void pickup(){
        if (component == 1){
            synchronized (awm){
                System.out.println(this.getName() + "获得AWM!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (scope8){
                    System.out.println(super.getName() + "获得8倍镜!");
                }
            }
        } else {
            synchronized (scope8){
                System.out.println(super.getName() + "获得8倍镜!");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (awm){
                    System.out.println(this.getName() + "获得AWM!");
                }
            }
        }
    }
}

AWM和8倍镜都只有1个,一开始五五开拿到AWM,蛇哥拿到8倍镜,1秒钟后,五五开还想要一个8倍镜,而此时8倍镜还在蛇哥手中,所以只能等待,又过了1秒钟,蛇哥还想要AWM,可是AWM还在开哥手中,也只能等待,两个人互不想让,形成了死锁

解决办法:

不要放在同一个代码块中,不要锁套锁,可避免死锁发生

package com.tsymq.thread.concurrnet;

public class DeadLock {
    public static void main(String[] args) {
        TeamMember tm1 = new TeamMember(1, "五五开");
        TeamMember tm2 = new TeamMember(2, "蛇哥");
        tm1.start();
        tm2.start();
    }
}

class AWM{}

class Scope8{}

class TeamMember extends Thread {
    static AWM awm = new AWM();
    static Scope8 scope8 = new Scope8();
    private String name;
    private int component;

    public TeamMember(int component, String name) {
        super(name);
        this.name = name;
        this.component = component;
    }

    @Override
    public void run() {
        pickup();
    }

    public void pickup(){
        if (component == 1){
            synchronized (awm){
                System.out.println(this.getName() + "获得AWM!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // synchronized (scope8){
                //     System.out.println(super.getName() + "获得8倍镜!");
                // }
            }
            synchronized (scope8){
                System.out.println(super.getName() + "获得8倍镜!");
            }
        } else {
            synchronized (scope8){
                System.out.println(super.getName() + "获得8倍镜!");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // synchronized (awm){
                //     System.out.println(this.getName() + "获得AWM!");
                // }
            }
            synchronized (awm){
                System.out.println(this.getName() + "获得AWM!");
            }
        }
    }
}

在五五开拿到AWM,蛇哥拿到8倍镜后,1秒钟后,开哥放弃了AWM,想要8倍镜,但是还在蛇哥手中,所以等待,又1秒钟后,蛇哥放弃了8倍镜,想要AWM,此时开哥已经放弃了AWM,蛇哥拿到了AWM,由于蛇哥已经放弃了8倍镜,所以开哥成功拿到8倍镜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值