java中怎么避免程序死锁

本篇文章为大家展示了java中怎么避免程序死锁,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

汤阴网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。成都创新互联成立于2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联

死锁发生的条件

互斥,共享资源只能被一个线程占用

占有且等待,线程 t1 已经取得共享资源 s1,尝试获取共享资源 s2 的时候,不释放共享资源 s1

不可抢占,其他线程不能强行抢占线程 t1 占有的资源 s1

循环等待,线程 t1 等待线程 t2 占有的资源,线程 t2 等待线程 t1 占有的资源

避免死锁的方法

对于以上 4 个条件,只要破坏其中一个条件,就可以避免死锁的发生。

对于第一个条件 "互斥" 是不能破坏的,因为加锁就是为了保证互斥。

其他三个条件,我们可以尝试

一次性申请所有的资源,破坏 "占有且等待" 条件

占有部分资源的线程进一步申请其他资源时,如果申请不到,主动释放它占有的资源,破坏 "不可抢占" 条件

按序申请资源,破坏 "循环等待" 条件

使用管理类一次性申请所有的资源,破坏 "占有且等待" 条件示例

package constxiong.concurrency.a023;

import java.util.HashSet;

import java.util.Set;

/**

* 测试 一次性申请所有的资源,破坏 "占有且等待" 条件示例

* @author ConstXiong

* @date 2019-09-24 14:04:12

*/

public class TestBreakLockAndWait {

//单例的资源管理类

private final static Manger manager = new Manger();

//资源1

private static Object res1 = new Object();

//资源2

private static Object res2 = new Object();

public static void main(String[] args) {

new Thread(() -> {

boolean applySuccess = false;

while (!applySuccess) {

//向管理类,申请res1和res2,申请失败,重试

applySuccess = manager.applyResources(res1, res2);

if (applySuccess) {

try {

System.out.println("线程:" + Thread.currentThread().getName() + " 申请 res1、res2 资源成功");

synchronized (res1) {

System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 res1 资源的锁");

//休眠 1秒

try {

Thread.sleep(1000);

} catch (Exception e) {

e.printStackTrace();

}

synchronized (res2) {

System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 res2 资源的锁");

}

}

} finally {

manager.returnResources(res1, res2);//归还资源

}

} else {

System.out.println("线程:" + Thread.currentThread().getName() + " 申请 res1、res2 资源失败");

//申请失败休眠 200 毫秒后重试

try {

Thread.sleep(200);

} catch (Exception e) {

e.printStackTrace();

}

}

}

}).start();

new Thread(() -> {

boolean applySuccess = false;

while (!applySuccess) {

//向管理类,申请res1和res2,申请失败,重试

applySuccess = manager.applyResources(res1, res2);

if (applySuccess) {

try {无锡妇科医院哪家好 http://www.xasgfk.cn/

System.out.println("线程:" + Thread.currentThread().getName() + " 申请 res1、res2 资源成功");

synchronized (res2) {

System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 res1 资源的锁");

//休眠 1秒

try {

Thread.sleep(1000);

} catch (Exception e) {

e.printStackTrace();

}

synchronized (res1) {

System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 res2 资源的锁");

}

}

} finally {

manager.returnResources(res1, res2);//归还资源

}

} else {

System.out.println("线程:" + Thread.currentThread().getName() + " 申请 res1、res2 资源失败");

//申请失败休眠 200 毫秒后重试

try {

Thread.sleep(200);

} catch (Exception e) {

e.printStackTrace();

}

}

}

}).start();

}

}

/**

* 资源申请、归还管理类

* @author ConstXiong

* @date 2019-09-24 14:10:57

*/

class Manger {

//资源存放集合

private Set

上述内容就是java中怎么避免程序死锁,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。


网站名称:java中怎么避免程序死锁
转载源于:http://azwzsj.com/article/pddohg.html