java多线程-死锁和死锁避免

一、死锁产生的四个必要条件

  • 互斥条件:某个资源只能被一个进程使用,其他线程请求资源只能等待,直到当前线程释放资源(不可优化项)
  • 占有并等待:进程已经保持一个资源,但是又提出了新要求,而这个资源被其他线程,自己保持的资源不被释放
  • 不可枪占条件:一个进程的资源未使用完,不会释放资源
  • 循环等待:线程获取资源存在一个循环链

二、死锁避免解决方案

  • 破坏互斥:对于共享资源,我们要破坏互斥条件,例如多线程对于只读文件的读取操作
  • 破坏占有并等待:当一个进程申请一个资源时,它不能占有其他资源。可以通过两种方式实现,方式一一个进程在执行前需要申请其所需的所有的资源。方式二,进程在没有资源时才可以申请。两种方式都有着缺点是会造成资源浪费和进程饥饿发生
  • 破坏不可枪占条件:如果一个线程持有一些资源,那么如果继续请求其他资源的时候,发现不能请求成功,这个时候其他进程就可以枪占该进程的资源。
  • 采用合适的进程推进顺序造成线程-银行家算法

三、银行家算法避免死锁

四、 一个死锁实例

package Concurrence;

/**
 * Created by luckyboy on 2018/8/7.
 */
public class DeadLock {
   
    public static void main(String[] args){
        Common common = new Common();
        Thread7 thread7 = new Thread7(common);
        Thread8 thread8 = new Thread8(common);
        thread7.start();
        thread8.start();
    }
}
class Thread7 extends Thread{
   
    private Common common;
    public Thread7(Common common){
        this.common = common;
    }
    @Override
    public void run(){
        common.methodA();
    }
}
class Thread8 extends Thread{
   
    private Common common;
    public Thread8(Common common){
        this.common 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值