多线程中死锁出现的原因及出现后的现象

多线程中死锁出现的原因及出现后的现象

  • 对以下代码出现死锁的分析:
    如果线程先拿到s1这个监视器,则其运行到sleep()处,出现了阻塞;
    在这个线程阻塞的过程中,另一个线程也有可能执行,则其拿到s2,同理,
    其运行到sleep()处,也出现了阻塞,当两个线程都“醒”的时候,一个线程
    拿着s1不放,另一个线程拿着s2不放。导致想要s1的线程拿不到s1,想要s2
    的线程拿不到s2,两个线程僵持下去,谁也得不到自己想要的资源,最终便
    形成了死锁
package com.anquan.bean;
/*
* 多线程的死锁问题
*
* (1)原因:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的资源,
*          就形成了线程中的死锁
*      Eg:两个人都喜欢着对方,可是谁都没有先开口表达,都在等待对方先说,
*          便僵持着,最后就错过了
* (2)现象:出现死锁后,不会出现异常,也没有提示,而是所有的线程都处于阻塞状态,无法继续执行
*
*
* 对以下代码出现死锁的分析:
*
*      如果线程先拿到s1这个监视器,则其运行到sleep()处,出现了阻塞;
*      在这个线程阻塞的过程中,另一个线程也有可能执行,则其拿到s2,同理,
*      其运行到sleep()处,也出现了阻塞,当两个线程都“醒”的时候,一个线程
*      拿着s1不放,另一个线程拿着s2不放。导致想要s1的线程拿不到s1,想要s2
*      的线程拿不到s2,两个线程僵持下去,谁也得不到自己想要的资源,最终便
*      形成了死锁
*
* */
public class DeadLock {
    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer();
        StringBuffer s2 = new StringBuffer();
        new Thread(){
            public void run(){
                synchronized(s1){
                    s1.append("a");
                    s2.append(1);
                }
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }

                synchronized(s2){
                    s1.append("b");
                    s2.append(2);

                }
                System.out.println(s1);
                System.out.println(s2);
            }
        }.start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized(s2){
                    s1.append("c");
                    s2.append(3);
                }
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
                synchronized(s1){
                    s1.append("d");
                    s2.append(4);
                }
                System.out.println(s1);
                System.out.println(s2);
            }
        }).start();
    }
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值