Java 手写一个死锁

死锁概念
多个并发进程因争夺系统资源而产生相互等待的现象

四个条件
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。

请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。

非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。

循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。

常用的解除死锁的方法:
1、抢占资源:从一个或多个进程中抢占足够数量的资源分配给死锁进程,以解除死锁状态。
2、终止(或撤销)进程:终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。

a、终止所有的死锁进程。这种方式简单粗暴,但是代价很大,很有可能会导致一些已经运行了很久的进程前功尽弃。

b、逐个终止进程,直至死锁状态解除。该方法的代价也很大,因为每终止一个进程就需要使用死锁检测来检测系统当前是否处于死锁状态。另外,每次终止进程的时候终止那个进程呢?每次都应该采用最优策略来选择一个“代价最小”的进程来解除死锁状态。
一般根据如下几个方面来决定终止哪个进程:
进程的优先级
进程已运行时间以及运行完成还需要的时间
进程已占用系统资源
进程运行完成还需要的资源
终止进程数目
进程是交互还是批处理

package com.jerry.Thread;

class Jerry{
    public void say(){
        System.out.println("jerry对barry说:不行,你要先请我吃饭");
    }
    public void eat(){
        System.out.println("barry请jerry吃饭");
    }
}
class Barry{
    public void say(){
        System.out.println("barry对jerry说:你请我吃饭,我就请你吃饭");
    }
    public void eat(){
        System.out.println("jerry请barry吃饭");
    }
}
public class MyDeadLock implements Runnable{
   public static Jerry jerry=new Jerry();
   public static Barry barry=new Barry();
   public  boolean flag=false;
    public void run() {
           if (flag){
               synchronized (jerry){
                   jerry.say();
                   try{
                       Thread.sleep(500);
                   }catch (InterruptedException ex){
                       ex.printStackTrace();
                   }
                   synchronized (barry){
                   jerry.eat();
                   }
               }
           }
           else {
               synchronized (barry){
                   barry.say();
                   try{
                       Thread.sleep(500);
                   }catch (InterruptedException ex){
                       ex.printStackTrace();
                   }
                   synchronized (jerry){
                   barry.eat();
                   }
               }
           }
    }

    public static void main(String[] args) {
        MyDeadLock t1=new MyDeadLock();
        MyDeadLock t2=new MyDeadLock();
        t1.flag=true;
        t2.flag=false;
        Thread tha=new Thread(t1);
        Thread thb=new Thread(t2);
        tha.start();
        thb.start();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值