手写一个死锁的程序,谈谈对其理解

手写一个死锁的程序

package com.study.juc.map;


/**
 * Created by Administrator on 2019/3/25.
 */
public class DeaLock implements Runnable {
    public static  Object oj1 = new Object();
    public static  Object obj2 = new Object();
    public boolean flag =false;
    @Override
    public void run() {

        if (flag){
            synchronized (oj1){
                System.out.println("线程thread拿到锁t0");
                try {
                    Thread.sleep(10000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj2){
                    System.out.println("线程之间并没有产生死锁thread---------1");
                }
            }

        }else {
            synchronized (obj2){
                System.out.println("线程thread1拿到锁t1");
                try {
                    Thread.sleep(10000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (oj1){
                    System.out.println("线程之间并没有产生死锁thread1-----------2");
                }
            }

        }

    }

    public static void main(String[] args) {
        DeaLock deaLock = new DeaLock();
        DeaLock deaLock1 = new DeaLock();
      deaLock.flag =false;
        deaLock1.flag = true;
        Thread thread = new Thread(deaLock);
        Thread thread1 = new Thread(deaLock1);
        thread.start();
        thread1.start();
    }
}


首先我们需要理解一下死锁的概念,多个并发进程因争夺系统资源而产生相互等待的现象。意思说造成死锁的原因我们可以理解为,当有两个线程在使用同一个共享资源的时候,在为了保证线程安全的情况下我们通常为加一把同步锁,此时就产生问题了,如代码所示,当tread获得共享对象oj1的锁以及tread1获得obj2的锁,而tread获取完锁后又要去获取obj2的锁因此会去等待tread1去释放obj2锁,而tread1又要去获取oj1的锁,此时两个线程都进入相互等待的情况,所以产生了死锁的问题。

以上是笔者通过一个简单死锁程序大概介绍了产生死锁的原因,大家可以通过程序演示一下死锁的过程,加深自己的印象,有问题欢迎加笔者微信进行讨论。
VX:549896196

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值