浅谈并发编程中的死锁及其规避策略

一、基础定义

1.限定资源----并发环境中有固定大小或数量的资源。例如数据库连接 池、固定大小的读写缓存等。
2.互斥----每一个时刻只能有一个线程能访问共享数据或共享资源。
3.线程饥饿—一个或一组线程很长时间内或永久被禁止。例如总让执行快的线程先运行,假如执行快的线程没完没了,那么执行时间长的线程就会“挨饿”。
4.死锁----两个线程或多个线程相互等待对方执行结束。每个线程都拥有其他线程需要的资源,得不到其他线程的资源就无法终止。
5.活锁----执行次序一致的线程,每个都想起步,但发现其他线程已“在路上”。由于竞争原因,线程会持续尝试起步,但在长时间内无法如愿,甚至永远无法启动。

二、死锁的发生的条件

1.互斥----当多个线程需要使用同一个资源,且这些资源满足这些条件,互斥就会发生:
* 无法在同一时刻为多个线程所使用;
* 数量上有限制;
这种资源常见的例子是数据库连接池、打开后用于写入的文件、记录锁或信号量。
2.上锁及等待----当某线程获取一个资源时,在获取其他资源并在完成其工作前,不会释放这个资源。
3.无抢先机制----线程无法从其他线程夺取资源。一个线程持有资源时,其他线程想获取该资源的唯一方式是等待这个线程释放该资源。
4.循环等待----也称为“死命拥抱”。想象有两个线程T1和T2,资源R1和R2,T1拥有R1,等待获取R2,T2拥有R2,等待获取R1。

三、规避死锁策略

1.不互斥—使用允许同时使用的资源,如:AtomicInteger;增加资源数量;在获取资源之前检查是否可用。
2.不上锁及等待----拒绝等待,就能消除死锁。例如获取资源之前就检查,遇到资源繁忙,就释放资源,重新来过。不过这种策略会带来潜在的问题:线程饥饿;活锁。
3.满足抢先机制----当发现资源繁忙时,就要求其拥有者释放之,如果拥有者还有等待其他资源,就全部释放重新来过。
4.不循环等待-----要求所有线程获取资源的次序一致,例如所有的线程都要获取资源R1,再获取资源R2。这样会带来两个问题:获取资源的次序与使用资源的次序不匹配;有时无法强求资源获取次序,如:获取资源R1依赖于先获取资源R2.

四、并发测试工具ConTest

参考链接:https://www.ibm.com/developerworks/cn/java/j-contest.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值