Java多线程死锁情况

Java多线程中死锁问题演示

package deadlock;

public class TestDeadLock {

    public static void main(String[] args) {
        new TestDeadLock().startUp();

    }

    public void startUp(){
        MyThread mt = new MyThread();

        new Thread(mt,"张三A").start();
        new Thread(mt,"李四B").start();
    }

    private class MyThread implements Runnable {

        private Object key1 = new Object();
        private Object key2 = new Object();
        private boolean falg = true;//设置一个判断

        public void run() {
            if(falg){
                //当进入判断后,改变falg值,下次进入时进入else语句
                falg = false;

                synchronized(key1){
                    System.out.println(Thread.currentThread().getName()+":key1");

                    try {
                        //出现休息时,执行另一个线程
                        Thread.sleep(100);
                    } catch (InterruptedException e) {

                        e.printStackTrace();
                    }
                    //另一个线程已经获得了key2这个钥匙,程序到此出现死锁
                    synchronized(key2){
                        System.out.println(Thread.currentThread().getName()+":key2");
                    }
                }
            }else{
                falg = true;
                synchronized(key2){
                    System.out.println(Thread.currentThread().getName()+":key2");

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {

                        e.printStackTrace();
                    }
                    synchronized(key1){
                        System.out.println(Thread.currentThread().getName()+":key1");
                    }
                }

            }

        }

    }

}

当使用多重synchronized语句时,可能还会出现死锁的情况,需要特别注意别让程序死锁,上面的语句执行时,类似。张三A找到key1的钥匙,打开A门,然后想得到key2钥匙打开B门,但此时key2钥匙已经被李四B得到了,同时在同步中,也不能退出,程序出现死锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值