JAVA中如何确保N个线程可以访问N个资源,但同时又不导致死锁?

使用多线程的时候,一种非常简单的避免死锁的方式:指定获取锁的顺序,并强制现场按照指定的顺序获取锁。因此,所有线程按照同样的顺序加锁和释放就不会出现死锁。

请问什么是死锁(deadlock)?

竞争不可抢占资源形成死锁

如果有两个线程T1和T2,要打开两个文件F1和F2,如果等线程T1打开F1和F2并释放后T2打开F1和F2不会出现任何问题。但是如果T1打开了F1此时需要去申请打开F2,此时T2打开了F2要去申请F1这样两个线程就阻塞了他们希望对方关闭自己所需的文件,但谁也无法运行,只能无限等待。

竞争可消耗资源形成死锁

以生产者消费者为举例,有一个公共的空间S一个生产者线程PT一个消费者线程CT,如果CT线程先运行,并没有对有没有产品判断不断地像公共空间S申请自己所需要的资源,那么生产者线程就永远无法运行产生死锁

具体来说:如果消费者线程持有公共空间的锁,并且不释放锁的话,生产者线程就无法获取到锁,从而无法将产品放入公共空间。而如果生产者线程在等待公共空间的锁时,消费者线程也在等待公共空间的锁,那么就会出现死锁的情况。

产生死锁的四个条件

互斥条件

一个资源每次只能被一个进程使用,互斥条件是非共享设备所必须的,不仅不能改变还需要加以保证。

请求和保持

一个进程因请求资源而阻塞且对已获得的资源保持不放

不可剥夺(不可抢占

线程已获得的资源在在未使用完之前,不能强行剥夺

循环等待

若干个线程之间形成一种头尾相接的循环等待资源关系

破坏死锁的四个条件

互斥条件

由于资源互斥是资源使用的固有特性,无法改变

请求和保持

一次性获取所有需要的资源,或者在进程开始执行之前,就为进程分配好所有需要的资源

不可剥夺(不可抢占

可以强制剥夺进程已经获得的资源

循环等待

对资源进行排序,规定每个进程按照固定的顺序请求资源

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值