第10章 避免活跃性危险

1.死锁

检测死锁:在等待关系的有向图中搜索循环。

产生死锁的4个必要条件:

1)互斥条件:共享资源独占访问

2)不可剥夺条件:不能强制其他线程释放资源

3)请求和保持条件:在等待申请的新的资源时,继续占有已分配的资源

4)循环等待条件:发生死锁时,存在一个循环等待的队列{P1, P2, P3, ...} P1等待P2占有的资源,P2等待P3占有的资源,...,Pn等待P1占有的资源。

死锁的预防:

1.资源一次性分配

2.当某进程新申请的资源未获取时,释放已获取的资源

3.资源有序分配,给资源分配编号,每个资源按编号递增请求资源,释放则相反

原文地址:https://www.cnblogs.com/walker993/p/9291874.html

时间: 2024-11-25 16:50:02

第10章 避免活跃性危险的相关文章

第10章避免活跃性危险

如果每个需要锁L和锁M的线程都以相同的顺序来获取L和M,那么就不会发生死锁了. 解决这个问题,必须定义锁的顺序,并在整个应用程序中都按照这个顺序来获取锁. 在制定锁的顺序时,可以使用System.identityHashCode方法,该方法将返回由Object.hashCode返回的值. private static final Object tieLock = new Object(); public void transferMoney(final Account fromAcct, fin

《Java并发编程实战》第十章 避免活跃性危险 读书笔记

一.死锁 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 百科百科 当两个以上的运算单元,双方都在等待对方停止运行,以取得系统资源,但是没有一方提前退出时,这种状况,就称为死锁.维基百科 1. 顺序死锁 最少有两个锁,一个线程获取到A锁需要获取B锁才能进行操作,而另外一个线程获取到了B锁,需要获取A锁才能执行操作,这种情况下容易出现顺序死锁. public class LeftRightDeadlock { priva

java并发编程(3)避免活跃性危险

活跃性危险 一.死锁 发生:每个人都不愿意放弃自己的锁,确想要别人的锁,这就会导致死锁  1.锁顺序死锁:如果每个线程以固定的顺序获取锁,那么至少在程序中不会出现锁顺序导致的死锁: 因为顺序固定如:所有线程:A-B-C 则无问题,如果一个A-B B-A则会发生死锁 例子1:简单死锁 public class LeftRightDeadlock { private final Object left = new Object(); private final Object right = new

避免活跃性

10 避免活跃性 在安全性与活跃性之间通常存在着某种制衡.例如加锁导致死锁,或者使用线程池和信号量来限制对资源的使用,但这些被限制的行为可能会导致资源死锁.. 10.1 死锁 当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞. 10.1.1 锁顺序死锁 如果用固定的顺序来获取锁,就不会发生死锁. 10.1.2动态的锁顺序死锁解决方案 其中一个线程从X向Y转账,另一个线程从Y向X转账,就会发生死锁: A:transferMoney(myACCOUnt,yourACC

java并发编程实战学习笔记之第三部分:活跃性、性能与测试

第十章 避免活跃性危险 锁顺序死锁:定义锁的顺序,可以通过某种方法决定每个锁的顺序,比如hashcode或者序列号之类的 在锁的调用顺序不是很明显的情况下,在持有锁的情况下调用其他外部方法一定要注意,可以通过开放调用,避免发生死锁的危险,即使用同步代码块保护仅仅保护那些共享变量即可,但这种降低锁粒度的方法可能会使得原本大的代码块失去原子性,解决办法为:将服务的状态改为关闭之前一直持有锁,状态改变之后,其他线程也就能够看到关闭信息从而不会再次执行关闭操作... 死锁的诊断与避免:    通过try

[摘录]第10章 培养胜过对手的力量

第五部分 谈判高手 优势秘籍力量.控制和影响,是每个人与别人交往时都会追求这些东西.不是吗?在进行谈判时,那些最有影响力火灾是最有力量的一方往往会在谈判时迫使对手做出更多的让步.如果你甘心让对手来操纵或影响你的话,显然你就很可能得不到自己想要的结果.另一方面,如果你直到哪些因素,能影响你的对手,并知道如何使用一些具体的方法来形成这种影响力,你就可以将形势控制在自己手中.权力本身也可以成为一种非常富有建设性的力量,当我们谈论权力时,我并不是指独裁者们用来祸害平民们的那种权力,我所说的权力实际上是一

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1.2 INSERT SELECT 语句 8.1.3 INSERT EXEC 语句 8.1.4 SELECT INTO 语句 8.1.5 BULK INSERT 语句 8.1.6 标识列属性和序列对象 8.1.6.1 标识列属性 8.1.6.2 序列对象 8.2 删除数据 8.2.1 DELETE 语

《Java并发编程实战》第十章 避免活跃性危急 读书笔记

一.死锁 所谓死锁: 是指两个或两个以上的进程在运行过程中.因争夺资源而造成的一种互相等待的现象.若无外力作用.它们都将无法推进下去. 百科百科 当两个以上的运算单元,两方都在等待对方停止执行,以取得系统资源,可是没有一方提前退出时,这样的状况,就称为死锁.维基百科 1. 顺序死锁 最少有两个锁.一个线程获取到A锁须要获取B锁才干进行操作,而另外一个线程获取到了B锁.须要获取A锁才干运行操作.这样的情况下easy出现顺序死锁. public class LeftRightDeadlock { p

【Java并发基础】安全性、活跃性与性能问题

前言 Java的多线程是一把双刃剑,使用好它可以使我们的程序更高效,但是出现并发问题时,我们的程序将会变得非常糟糕.并发编程中需要注意三方面的问题,分别是安全性.活跃性和性能问题. 安全性问题 我们经常说这个方法是线程安全的.这个类是线程安全的,那么到底该怎么理解线程安全呢? 要给线程安全性定一个非常明确的定义是比较复杂的.越正式的定义越复杂,也就越难理解.但是不管怎样,在线程安全性定义中,最核心的概念还是正确性,可以简单的理解为程序按照我们期望的执行. 正确性的含义是:某个类的行为与其规范完全