活跃性危险

一、死锁

  发生:每个人都不愿意放弃自己的锁,确想要别人的锁,这就会导致死锁

   1.锁顺序死锁:如果每个线程以固定的顺序获取锁,那么至少在程序中不会出现锁顺序导致的死锁;

    因为顺序固定如:所有线程:A-B-C 则无问题,如果一个A-B B-A则会发生死锁

  例子1:简单死锁

public class LeftRightDeadlock {private final Object left = new Object();private final Object right = new Object();public void leftRight() {synchronized (left) {       //锁住leftsynchronized (right) {  //锁住right
                doSomething();}}}//如果一个线程进入上面方法锁住 left,另一个线程进入下面方法锁住right,则会产生互相等待 而死锁public void rightLeft() {       synchronized (right) {      //锁住rightsynchronized (left) {   //锁住left
                doSomethingElse();}}}void doSomething() {}void doSomethingElse() {}
}

  例子2:转账死锁

public static void transferMoney(Account fromAccount,Account toAccount,DollarAmount amount)throws InsufficientFundsException {//转账 a-b 和 b-a ,如果同时发生,则有可能发生死锁;这种取决于参数的传入;并不是能够完全的判断得到synchronized (fromAccount) {synchronized (toAccount) {if (fromAccount.getBalance().compareTo(amount) < 0)throw new InsufficientFundsException();else {fromAccount.debit(amount);toAccount.credit(amount);}}}}

  

  2.资源死锁

    同时获取资源,而资源却相互被锁住,就会产生死锁;

      如:一个应用有两个数据库,刚好两个线程进入两个连接池,两个连接池都满了,则需要相互等待对方释放连接

      线程饥饿死锁:表现为线程池不够,线程池内的线程相互等待(A提交B到单线程池,右提交C到单线程池,但是B要等待C完成才能执行)

  3.活锁

    不会阻塞线程,但是也不能继续执行

    类似于程序不断尝试不断失败,永远无法跳出来

转载于:https://www.cnblogs.com/zhangxinly/p/6909730.html

java并发编程(3)避免活跃性危险相关推荐

  1. java避免活锁.死锁的解决,java并发编程(九): 避免活跃性危险

    避免活跃性危险: 本部分讨论活跃性故障的原因,及如何避免它们. 死锁: 典型的哲学家进餐问题. 锁顺序死锁: 如上面哲学家进餐有可能发生下面的情况: 上面发生死锁的根本原因在于两个线程以不同的顺序来获 ...

  2. Java高并发编程:活跃性危险

    Java高并发程序中,不得不出现资源竞争以及一些其他严重的问题,比如死锁.线程饥饿.响应性问题和活锁问题.在安全性与活跃性之间通常存在依赖,我们使用加锁机制来确保线程安全,但是如果过度地使用加锁,则可 ...

  3. Java并发编程实战系列10之避免活跃性危险

    10.1 死锁 哲学家问题 有环 A等B,B等A 数据库往往可以检测和解决死锁//TODO JVM不行,一旦死锁只有停止重启. 下面分别介绍了几种典型的死锁情况: 10.1.1 Lock orderi ...

  4. 《Java并发编程实战》【第三部分 活跃性、性能与测试】

    文章目录 第10章 避免活跃性危险 10.1 死锁 10.1.1 锁顺序死锁 10.1.2 动态的锁顺序死锁 10.1.3 在协作对象之间发生的死锁 10.1.4 开放调用 10.1.5 资源死锁 1 ...

  5. java并发编程实践(1)intro

    [0]README 0.1)本文部分文字描述转自"java并发编程实践",旨在学习"java并发编程实践(1)intro"的相关知识: [3]线程带来的风险 [ ...

  6. 【极客时间】《Java并发编程实战》学习笔记

    目录: 开篇词 | 你为什么需要学习并发编程? 内容来源:开篇词 | 你为什么需要学习并发编程?-极客时间 例如,Java 里 synchronized.wait()/notify() 相关的知识很琐 ...

  7. 《Java并发编程实战》读书笔记

    Subsections  线程安全(Thread safety) 锁(lock) 共享对象 对象组合 基础构建模块 任务执行 取消和关闭 线程池的使用 性能与可伸缩性 并发程序的测试 显示锁 原子变量 ...

  8. 《Java 并发编程实战》--读书笔记

    Java 并发编程实战 注: 极客时间<Java 并发编程实战>–读书笔记 GitHub:https://github.com/ByrsH/Reading-notes/blob/maste ...

  9. java 并发编程视频教程_全面深入学习java并发编程,视频教程下载

    课程目标: * 颠覆一些你以为"正确"的认知,纠正其它同类视频的错误 * 100+ 张手绘图 & 流程图,帮助你形成正确的"多线程世界观" * 以知识点 ...

最新文章

  1. PCL滤波介绍(3)
  2. python预处理删除特殊字符_python - 如何删除包含特殊字符的字符串?_others_酷徒编程知识库...
  3. 第 3 章 镜像 - 010 - base 镜像
  4. oracle spring 分页查询,SpringJDBC 调用oracle 通用存储过程分页
  5. SpringBoot异常处理以及对数据正确性的检查
  6. pbr发光 unity_PBR的基础理论
  7. Star Schema完全参考手册学习笔记六
  8. HTML5画布(矩形)
  9. python趋势回归_Python 回归分析 - 树懒学堂
  10. 前端证券项目_非科班二本前端大厂面试的心路历程和总结(腾讯、头条、阿里、京东)...
  11. 最多添加3个标签,每个标签最长6字,空格或逗号隔开
  12. 视频编解码(八):264/265解码器小结
  13. Neutron Vlan Network 原理- 每天5分钟玩转 OpenStack(92)
  14. 简单的扫雷游戏代码(c++)
  15. 利用SEQ2SEQ模型实现车牌识别
  16. springboot读取resources目录下文件
  17. WiFi 802.11可调参数说明---电源管理调整(聆听间隔/DTIM/ATIM)
  18. 2021年下半年市场营销案例分析集锦
  19. 《黑天鹅》纳西姆-尼古拉斯-塔勒布_epub+mobi+azw3
  20. Mac电脑高效办公必备武器——雷神Thor

热门文章

  1. seo 伪原创_seo文章优化(怎么样做好伪原创文章)
  2. 服务器安装nvidia驱动_无法安装最新版NVIDIA显卡驱动,从技术角度该怎么办?
  3. android横向滑动控件,Android学习——HorizontalScollview水平滚动控件
  4. ioswebview混编_iOS与H5混编--优秀的第三方框架WebViewJavascriptBridge
  5. mockito单元测试示例_Mockito模拟示例
  6. ubuntu服务器设置_Ubuntu服务器设置–安全最佳实践
  7. kotlin_Kotlin print(),println(),readLine(),Scanner,REPL
  8. restful soap_Web服务面试问题– SOAP,RESTful
  9. win10 安装低版本的 .net framework
  10. jenkins修改任务工作目录